【发布时间】:2014-04-09 15:20:15
【问题描述】:
我创建了一个指令,它接受一些属性并使用这些属性初始化隔离范围。如果未指定属性,则应使用计算值初始化隔离范围。
我添加了一个链接函数来检查范围并初始化默认值(如果没有使用属性设置值)。范围已经初始化,但是如果我设置了一个默认值,那么它稍后会被框架覆盖。
一种解决方法是使用 $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);
}
};
});
我准备了一个JSFiddle 来说明正在发生的事情。
- msg1 是通过属性初始化的,并且始终具有正确的值。
- msg2 不是通过属性初始化的,但可以使用属性进行设置。调用链接方法后,此值将被覆盖。
- msg3 不是通过属性初始化的,这甚至是不可能的。这个值是在构造控制器时设置的,可以正常工作。
似乎 AngularJS 在创建控制器并将指令链接到 DOM 之后创建范围并更新其值。谁能告诉我推荐的方法吗?
【问题讨论】:
标签: angularjs angularjs-directive angularjs-scope