Ram*_*ein 5 angularjs angularjs-directive angularjs-scope
我创建了一个接受一些属性的指令,并使用这些属性初始化隔离的作用域.如果未指定属性,则应使用计算值初始化隔离范围.
我添加了一个链接函数来检查范围并初始化默认值(如果没有使用属性设置值).范围已初始化,但如果我设置了默认值,那么框架将稍后覆盖它.
解决方法是使用$ timeout(...)并在之后设置它,但这似乎太过分了.
function ($timeout) {
return {
scope: { msg1: '@', msg2: '@' },
template: '<div>{{msg1}} {{msg2}} {{msg3}}</div>',
link: function ($scope, $elt, $attr) {
var action = function() {
if (!$scope.msg2) $scope.msg1 = 'msg1';
if (!$scope.msg2) $scope.msg2 = 'msg2';
if (!$scope.msg3) $scope.msg3 = 'msg3';
};
action();
//$timeout(action, 0);
}
};
});
Run Code Online (Sandbox Code Playgroud)
我准备了一个JSFiddle来说明发生了什么.
似乎AngularJS在创建控制器并将指令链接到DOM之后创建范围并更新其值.谁能告诉我推荐的方法呢?
如果要设置“@”类型绑定的默认值,则必须对属性本身进行操作。阅读有关$compile 的内容
您可以在编译函数中执行此操作:
compile: function(element, attrs) {
if (!attrs.msg1) attrs.msg1 = 'msg1';
if (!attrs.msg2) attrs.msg2 = 'msg2';
}
Run Code Online (Sandbox Code Playgroud)
或者您也可以使用链接功能。
link: function ($scope, $elt, attrs) {
var action = function() {
console.log('msg1:' + $scope.msg1 + ', msg2:' + $scope.msg2 + ', msg3: ' + $scope.msg3);
if (!attrs.msg1) attrs.msg1 = 'msg1';
if (!attrs.msg2) attrs.msg2 = 'msg2';
if (!attrs.msg3) attrs.msg3 = 'msg3';
};
action();
}
Run Code Online (Sandbox Code Playgroud)
原因是与属性设置的绑定会覆盖您对该范围变量的更改。我们需要修改从中获取值的属性。
@ 或 @attr - 将本地范围属性绑定到 DOM 属性的值。结果始终是字符串,因为 DOM 属性是字符串
| 归档时间: |
|
| 查看次数: |
10359 次 |
| 最近记录: |