2016-07-11 4 views
1

Ich habe eine Richtlinie, die eine Änderung in der Scope-Element sections.data, die ich später assign, um die Daten auf UI zu aktualisieren. Dieser Ansatz funktioniert jedoch in der Funktion change_subnav, aber nicht im Switch-Fall (die Kommentare wurden dem Code hinzugefügt). Warum passiert dies? Der Code für diese Änderung ist gleich. Ich schätze jede Hilfe hier. Bitte lassen Sie mich wissen, wenn ich weitere Informationen hinzufügen muss.Zuordnung zu Bereich funktioniert nicht in der Direktive

Plunker-https://embed.plnkr.co/wmoJcQ/

.directive('selectSubnav', function ($parse) { 
    return { 
     restrict: 'A', 
     link: function (scope, element, attr) { 

      var change_subnav = function (subnav) { 
       if (scope.active_tab == 'user_exercises') { 
        var sections = {}; 
        sections[subnav] = scope[scope.active_tab][subnav]; 
        // this works 
        scope.$apply(function() { 
         $parse('sections.data').assign(scope.$parent, sections); 
        }); 
       } else { 

       } 
      }; 

      $(element).on('click', function() { 
       $(element).parent().children().removeClass('active'); 
       $(element).addClass('active'); 

       switch (attr.selectSubnav) { 
        case 'All': 
         // this doesn't work 
         scope.$apply(function() { 
          $parse('sections.data').assign(scope.$parent, scope[scope.active_tab]); 
          console.log(scope.sections.data); 
         }); 

         break; 
        default: 
         change_subnav(attr.selectSubnav); 
         break; 
       } 
      }); 
     } 
    } 
}) 

UPDATE

.directive('selectSubnav', function ($parse) { 
    return { 
     restrict: 'A', 
     link: function (scope, element, attr) { 
      var currentScope = scope; 
      var change_subnav = function (subnav) { 
       if (scope.active_tab == 'user_exercises') { 
        var sections = {}; 
        sections[subnav] = scope[scope.active_tab][subnav]; 
       } else { 

       } 

       return sections; 
      }; 

      $(element).on('click', function() { 
       $(element).parent().children().removeClass('active'); 
       $(element).addClass('active'); 

       var sections; 

       switch (attr.selectSubnav) { 
        case 'All': 
         // this doesn't work 
         sections = currentScope[currentScope.active_tab]; 
         break; 
        default: 
         sections = change_subnav(attr.selectSubnav); 
         break; 
       } 

       currentScope.$apply(function() { 
        $parse('sections.data').assign(currentScope.$parent, sections); 
       }); 
      }); 
     } 
    } 
}) 
+0

A Plunker mit Ihrem HTML-und Controller-Code für Kontext nützlich sein würde. – jbrown

+0

Hallo, ich habe den Plunker hinzugefügt. Versucht, das Szenario so weit wie möglich zu replizieren –

Antwort

0

Sie bereits Zugriff auf Umfang in Ihrem Link-Funktion haben, so dass anstelle scope.sections.data wie dies der Aktualisierung:

$parse('sections.data').assign(scope.$parent, sections); 

Sie können dies einfach tun:

$parse('sections.data').assign(scope, sections); 

Oder, noch besser es nur direkt aktualisieren, wie folgt aus:

scope.sections.data = sections; 
+0

'$ parse ('sections.data'). Zuweisen (Bereich, Abschnitte);' das hat funktioniert .. 'scope.sections.data = Abschnitte;' Dies wird nicht funktionieren, weil die Anweisung braucht keinen Scope-Digestion, wir müssen es explizit nennen. Vielen Dank! –