$watch 复杂的表达式
$watch on complex expression
我的指令中有一个独立的范围变量,它是一个表达式,由几个其他变量一起求值的结果组成,例如:
<my-directive is-my-expr="!var1 && var2"></my-directive>
指令的定义类似于:
app.directive('myDirective', function () {
return {
restrict: 'E',
scope: {
isMyExpr: '='
},
template: '<span>{{ isMyExpr ? "True" : "False" }}</span>',
link: link
};
function link($scope) {
$scope.$watch('isMyExpr', function (newValue) { $scope.isMyExpr = newValue; });
}
});
但是,更改 var1 或 var2 的值不会改变指令的显示结果。我怎样才能做到这一点?
所以首先,你不需要在指令里面设置一个$watch
来手动更新$scope.isMyExpr
。事实上,如图所示的手表是多余的,因为侦听器函数只会在初始化时以及值更改时调用。
我建议更改为对隔离范围 属性 使用符号 (&
) 绑定。这将为您提供作用域上的 $scope.isMyExpr()
函数,该函数将评估标记中指定的表达式的结果。
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.var1 = $scope.var2 = false;
});
app.directive('myDirective', function() {
return {
restrict: 'E',
scope: {
isMyExpr: '&'
},
template: "<span>{{ isMyExpr() ? 'True' : 'False' }}</span>",
link: link
};
function link($scope) {
/* nothing for now */
}
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="plunker">
<div ng-controller="MainCtrl">
<div>
<div>
<label>
<input type="checkbox" ng-model="var1">Var1 = {{var1}}</label>
</div>
<div>
<label>
<input type="checkbox" ng-model="var2">Var2 = {{var2}}</label>
</div>
</div>
<div>
Inside my directive, isMyExpr() equals:
<my-directive is-my-expr="!var1 && var2"></my-directive>
</div>
</div>
</div>
这是相同代码的a working Plunkr。
我的指令中有一个独立的范围变量,它是一个表达式,由几个其他变量一起求值的结果组成,例如:
<my-directive is-my-expr="!var1 && var2"></my-directive>
指令的定义类似于:
app.directive('myDirective', function () {
return {
restrict: 'E',
scope: {
isMyExpr: '='
},
template: '<span>{{ isMyExpr ? "True" : "False" }}</span>',
link: link
};
function link($scope) {
$scope.$watch('isMyExpr', function (newValue) { $scope.isMyExpr = newValue; });
}
});
但是,更改 var1 或 var2 的值不会改变指令的显示结果。我怎样才能做到这一点?
所以首先,你不需要在指令里面设置一个$watch
来手动更新$scope.isMyExpr
。事实上,如图所示的手表是多余的,因为侦听器函数只会在初始化时以及值更改时调用。
我建议更改为对隔离范围 属性 使用符号 (&
) 绑定。这将为您提供作用域上的 $scope.isMyExpr()
函数,该函数将评估标记中指定的表达式的结果。
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.var1 = $scope.var2 = false;
});
app.directive('myDirective', function() {
return {
restrict: 'E',
scope: {
isMyExpr: '&'
},
template: "<span>{{ isMyExpr() ? 'True' : 'False' }}</span>",
link: link
};
function link($scope) {
/* nothing for now */
}
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="plunker">
<div ng-controller="MainCtrl">
<div>
<div>
<label>
<input type="checkbox" ng-model="var1">Var1 = {{var1}}</label>
</div>
<div>
<label>
<input type="checkbox" ng-model="var2">Var2 = {{var2}}</label>
</div>
</div>
<div>
Inside my directive, isMyExpr() equals:
<my-directive is-my-expr="!var1 && var2"></my-directive>
</div>
</div>
</div>
这是相同代码的a working Plunkr。