虽然我同意使用$watch
代替attrs.$observe
这不是您收到错误消息的主要原因。
问题是您正在尝试为不可分配的表达式分配一个值 - 正如错误消息告诉您的那样:Non-assignable model expression: 1 (directive: testDirective)
本例中不可赋值的表达式是数字“1”
<test-directive activate="1">
您设法将初始值 (1) 传递给指令,但是当指令尝试更新该值时,属性activate无法更改 - 因为它是一个数字。
因此,您需要做的是将其更改为变量,以便稍后更新该值。
请参阅下面的代码,其中我通过控制器在 $scope 中初始化了一个名为 activate.initialValue 的变量。
而且我也用过$watch
代替attrs.$observe
.
我已经添加了$timeout
只是为了模拟 2 秒后更改激活值的事件。
HTML
<body ng-app="app" ng-controller="appCtrl">
<test-directive activate="activate.initialValue"></test-directive>
</body>
JS
var app = angular.module('app', []);
app.controller('appCtrl', function($scope){
$scope.activate = {
initialValue : 1
}
});
var app = angular.module('app', []);
app.controller('appCtrl', function($scope){
$scope.activate = {
initialValue : 2
}
});
app.directive('testDirective', function($timeout) {
return {
restrict: 'E',
scope: {
activate : '='
},
link: function(scope, elem, attrs) {
scope.$watch('activate', function(newValue, oldValue){
console.log('activate has changed', newValue);
});
$timeout(function(){
scope.activate = 0;
}, 2000);
},
template: "{{activate}}"
}
});
您还可以在这里查看工作(http://jsfiddle.net/mgSpY/63/).
这是关于它的 AngularJS 官方文档(http://docs.angularjs.org/error/ngModel:nonassign)