Ich habe eine Winkelanweisung, die wie folgt initialisiert ist:
<conversation style="height:300px" type="convo" type-id="{{some_prop}}"></conversation>
Ich möchte, dass es intelligent genug ist, um die Direktive bei $scope.some_prop
Änderungen zu aktualisieren , da dies impliziert, dass völlig andere Inhalte angezeigt werden sollten.
Ich habe es so getestet wie es ist und nichts passiert, die Verknüpfungsfunktion wird nicht einmal aufgerufen, wenn $scope.some_prop
Änderungen vorgenommen werden. Gibt es eine Möglichkeit, dies zu erreichen?
quelle
=
inscope:
eine bidirektionale Bindung erstellt, dh Änderungen im untergeordneten Bereich werden auf den übergeordneten Bereich übertragen und umgekehrt - ist dies nicht der Fall? Ich muss in der Lage sein, eine Anweisung anzuweisen, sich selbst vom übergeordneten Controller zu aktualisieren.Sie versuchen, die Eigenschaft des Attributs in der Direktive zu überwachen. Sie können die Eigenschaft von Attributänderungen mit $ watch () wie folgt beobachten:
angular.module('myApp').directive('conversation', function() { return { restrict: 'E', replace: true, compile: function(tElement, attr) { attr.$observe('typeId', function(data) { console.log("Updated data ", data); }, true); } }; });
Denken Sie daran, dass ich hier in der Direktive die Funktion 'Kompilieren' verwendet habe, da Sie nicht erwähnt haben, ob Sie Modelle haben und ob dies leistungsabhängig ist.
Wenn Sie Modelle haben, müssen Sie die Funktion ' Kompilieren ' in ' Verknüpfen ' ändern oder ' Controller ' verwenden und die Eigenschaft von Modelländerungen überwachen. Verwenden Sie $ watch () und nehmen Sie den Winkel {{}} Klammern aus der Eigenschaft, Beispiel:
<conversation style="height:300px" type="convo" type-id="some_prop"></conversation>
Und in der Richtlinie:
angular.module('myApp').directive('conversation', function() { return { scope: { typeId: '=', }, link: function(scope, elm, attr) { scope.$watch('typeId', function(newValue, oldValue) { if (newValue !== oldValue) { // You actions here console.log("I got the new value! ", newValue); } }, true); } }; });
quelle
Ich hoffe, dies wird dazu beitragen, die Direktive zum Wert aus dem übergeordneten Bereich neu zu laden / zu aktualisieren
<html> <head> <!-- version 1.4.5 --> <script src="angular.js"></script> </head> <body ng-app="app" ng-controller="Ctrl"> <my-test reload-on="update"></my-test><br> <button ng-click="update = update+1;">update {{update}}</button> </body> <script> var app = angular.module('app', []) app.controller('Ctrl', function($scope) { $scope.update = 0; }); app.directive('myTest', function() { return { restrict: 'AE', scope: { reloadOn: '=' }, controller: function($scope) { $scope.$watch('reloadOn', function(newVal, oldVal) { // all directive code here console.log("Reloaded successfully......" + $scope.reloadOn); }); }, template: '<span> {{reloadOn}} </span>' } }); </script> </html>
quelle
angular.module('app').directive('conversation', function() { return { restrict: 'E', link: function ($scope, $elm, $attr) { $scope.$watch("some_prop", function (newValue, oldValue) { var typeId = $attr.type-id; // Your logic. }); } }; }
quelle
Wenn Sie unter AngularJS 1.5.3 oder neuer arbeiten, sollten Sie in Betracht ziehen, anstelle von Anweisungen zu Komponenten zu wechseln. Diese funktionieren sehr ähnlich wie Direktiven, enthalten jedoch einige sehr nützliche zusätzliche Funktionen, wie z. B. $ onChanges (ChangesObj), einen der Lifecycle-Hooks, der aufgerufen wird, wenn Einwegbindungen aktualisiert werden.
app.component('conversation ', { bindings: { type: '@', typeId: '=' }, controller: function() { this.$onChanges = function(changes) { // check if your specific property has changed // that because $onChanges is fired whenever each property is changed from you parent ctrl if(!!changes.typeId){ refreshYourComponent(); } }; }, templateUrl: 'conversation .html' });
Hier sind die Dokumente zum Vertiefen in Komponenten.
quelle