我有一个案例,我有一个指令,它获取一个值形式Controller $ scope.colorName。指令将其绑定为单向并将此值保存在隔离范围“colorVar”中。指令模板将“colorVar”渲染为{{colorVar}}。 我需要在指令的link函数中更改“colorVar”的值。但它没有反映在UI上。
HTML:
<div ng-app="myApp" ng-controller="appCtrl">
{{colorName}}
<my-directive color='{{colorName}}'>
</my-directive>
</div>
JavaScript的:
angular.module('myApp', []).controller('appCtrl',function($scope){
$scope.colorName='red';
})
.directive('myDirective', function () {
return {
restrict: 'E',
scope: {
colorVar: '@color'
},
template: '<span> {{ colorVar }} </span><span>{{extra}}</span>',
link:function(scope,element,attrs){
scope.colorVar='orange';
scope.extra='kk';
}
};
});
在链接功能中,我使用“橙色”更新了scope.colorVar
,但未反映在用户界面上,但scope.exta
确实反映在用户界面上。
http://jsfiddle.net/ut7628d7/1/
知道我做错了什么。为什么会发生这种情况以及如何实现呢? 谢谢。
答案 0 :(得分:0)
如果您希望能够更改指令中的颜色形式,请使用双向绑定。 e.g。
scope: {
colorVar: '=color'
}
HTML
<my-directive color='colorName'></my-directive>
答案 1 :(得分:0)
这取决于您是否希望指令的更新值也改变控制器中的原始值:
如果您希望指令修改控制器中的原始colorName,请通过引用传递colorName并在模板中使用双向绑定:
<my-directive color='colorName'> <!-- instead of color='{{colorName}}' -->
并在指令中:
scope: {
colorVar: '=color' // instead of '@color'
},
这个输出将是“橙色橙色kk”,因为它始终是相同的对象,因此当指令将其更改为“橙色”时,它将影响两个地方。
如果你希望指令只修改它自己的值,并输出“red orange kk”,那么就像现在一样保持一个属性绑定,但是使用$ timeout将指令链接函数延迟一个tick,这样值就可以了它在范围上设置将覆盖通过指令属性接收的值:
$timeout(function() {
scope.colorVar = 'orange';
scope.extra = 'kk';
});
同时,单独的原始颜色值在控制器中保持不变,因为它作为字符串而不是作为对象引用传递给指令。