przy użyciu AngularJS. Mam dyrektywę, że chcę mieć dwukierunkowe powiązanie danych. Dyrektywa będzie miała atrybut o nazwie "aktywuj". Początkowo wartość "aktywuj" będzie wynosić "1".Zmień atrybut z dyrektywy
Funkcja łącza do dyrektywy sprawdzi, czy "aktywacja" jest równa "1". Jeśli tak, zmieni "uaktywnij" na 0, ale zrobi też inne rzeczy.
Później, jeśli chcę, aby dyrektywa ponownie wykonała pewne czynności, w kontrolerze ponownie zmienię "aktywuj" na "1". Ponieważ dyrektywa ma zegarek, powtórzy cykl.
Niestety, za każdym razem, gdy to robię, pojawia się "Wyrażenie" 0 "użyte w dyrektywie" testDirective "jest nieprzenoszalne!" lub "Niepowtarzalne wyrażenie modelu: 1 (dyrektywa: testDirective)".
Oto HTML:
<body ng-app="app">
<test-directive activate="1"></test-directive>
</body>
Oto JS:
var app = angular.module('app', []);
app.directive('testDirective', function() {
return {
restrict: 'E',
scope: {
activate : '='
},
link: function(scope, elem, attrs, controller) {
var el = elem[0];
var updateContent = function() {
el.innerText = 'Activate=' + scope.activate;
};
updateContent();
attrs.$observe('activate', function() {
console.log('Activate=' + scope.activate);
if(scope.activate == '1') {
scope.activate = '0'
updateContent();
}
});
}
}
});
Oto ona na jsFiddle: http://jsfiddle.net/justbn/mgSpY/3/
Dlaczego nie mogę zmienić wartość zapisaną w atrybucie tej dyrektywy ? Używam 2-way binding.
Dokumenty mówią: "Jeśli właściwość zasięgu nadrzędnego nie istnieje, zostanie zgłoszony wyjątek NON_ASSIGNABLE_MODEL_EXPRESSION."
UWAGA: Treść aktualizacji prawidłowo pokazuje wartość "aktywuj". Jednak wartość "aktywuj" w "" nie aktualizuje się.
Jednak to nie ma dla mnie żadnego sensu, ponieważ właściwość zakresu rodzica istnieje.
Wszelkie pomysły?
dluz: Podałem odpowiedź Michaelowi za działające rozwiązanie. Ale po prostu zmieniłem to dla ciebie. Wyjaśniłeś to, aby lepiej to zrozumieć. Dzięki wielkie! – Justin
Justin: chętnie pomożemy! :) –
To była część odpowiedzi dla mnie. Musiałem również uruchomić lunetę. $ Apply() po modyfikacji, lub $ watch nie wyzwoli. – LucasBeef