2016-07-20 4 views
2

Ich versuche, eine Tabelle basierend auf einem Array von Objekten zu erstellen, sortierbar durch Klicken auf die Überschriften. Ich habe eine Frage zu dieser Implementierung der Sortierfunktion.Warum funktioniert ng-click nur in dieser Direktive mit einer Funktion, nicht einer Zuweisung?

let myDirectiveTemplate = ` 
<table class="directiveTable"> 
    <thead> 
    <th ng-repeat="(key,val) in tableObjectArray[0] track by $index"> 
     <a href="" ng-click="changeCriteria(key)"> 
     {{key}} 
     </a> 
    </th> 
    </thead> 
    <tbody> 
    <tr ng-repeat="object in tableObjectArray | orderBy:criteria track by $index"> 
     <td ng-repeat="prop in object track by $index"> 
     {{prop}} 
     </td> 
    </tr> 
    </tbody> 
</table> 
` 

let app2 = angular.module('myDirectiveModule', []); 

let myDirective =() => { 
    return { 
    restrict: 'E', 
    scope: { 
     tableObjectArray: '=objects', 
    }, 
    controller: myDirectiveController, 
    template: myDirectiveTemplate, 
    } 
}; 

let myDirectiveController = ($scope) => { 
$scope.changeCriteria = criteria => { 
    $scope.criteria = criteria; 
} 
}; 

app2.directive('myDirective', myDirective); 
app2.controller('myDirectiveController', myDirectiveController); 

Dies funktioniert. Aber wenn ich in der Vorlage die ng-klicke auf

ändern, scheint es nichts zu tun. Auch wenn die Variable nur mit doppelten geschweiften Klammern angezeigt wird, ändert sie sich nicht beim Klicken. Ich habe die Variablenzuweisung in einem ng-Klick zuvor verwendet; Was ist los?

Antwort

2

Da ng-repeat einen untergeordneten Bereich für jedes Element erstellt, so ändern Sie ein primitiv nur innerhalb dieses untergeordneten Bereichs. Da es keine Vererbung mit Primitiven ist der übergeordnete Bereich in der Steuerung bleibt die gleichen

Wenn Sie ein Objekt in der Steuerung erklärt verwenden sind, oder ControllerAs alias verwendet es

$scope.myModel ={criteria: 'defaultValue'} 

ng-click="myModel.criteria = key" 
<tr ng-repeat="object in tableObjectArray | orderBy:myModel.criteria track by $index"> 

Von einer Vererbung durch fein funktionieren würde, Das Debuggen und Testen von Standpunkten unter Verwendung einer Funktion ist im Allgemeinen bevorzugt.

+0

Egal wie oft ich hörte "Binde dich nicht an ein Primitiv" und "Du brauchst einen Punkt", musste ich es selbst sehen. Vielen Dank! Ich hatte tatsächlich versucht, es zu punktieren, habe es aber NICHT zuerst in meinem Controller deklariert. Oh! –

+1

hilft auch zu wissen, wo Kind Bereiche intern erstellt werden. 'ng-if' und' ng-include' sind zwei andere, die Leute auch fangen – charlietfl

+1

Wenn Sie zu 'ControllerAs' wechseln Methodik Probleme wie diese verschwinden, weil die meisten alles einen Punkt haben dann – charlietfl

Verwandte Themen