强制双向绑定生效
Force Two-Way-Binding to Take Effect
我正在编写一个 AngularJS 1.x 指令(我们称之为 MyDirective
)。其范围声明如下:
scope: {
accessor: '='
}
在其 link
函数中,我将一个新对象分配给 accessor
字段,如下所示:
scope.accessor = {
// methods such as doSomethingToMyDirective()
};
现在,我用 $compile
:
动态实例化这个指令
var element = $compile('<div data-my-directive data-accessor="directiveAccessor"></div>')(myScope);
一旦它有 运行,我当前的作用域 (myScope
) 就有一个 directiveAccessor
属性 引用在指令中创建的对象实例。
问题:此字段不能立即可用。
换句话说,一旦我有运行 $compile
,我不能在下一个命令中立即访问myScope.directiveAccessor
。当我稍后检查范围时,该字段就在那里,可能一个 $timeout
就足够了。
通过一些断点,我可以观察到对象确实是在执行 $compile
时创建的;内部作用域上的 accessor
已经指向该对象。但是,似乎将值从内部范围的 accessor
复制到 myScope.directiveAccessor
的双向绑定直到稍后才会激活。
有没有办法强制AngularJS立即复制双向绑定值(即不等待任何承诺)?
使用表达式绑定(&
)立即设置父作用域变量:
app.directive("myDirective", function () {
return {
scope: { onPostLink: "&" },
link: postLink
};
function postLink(scope, elem, attrs) {
scope.accessor = {
doSomethingToMyDirective: function() {
return "Hello world";
}
};
scope.onPostLink({$event: scope.accessor});
scope.$on("$destroy", function() {
scope.onPostLink({$event: null});
});
}
})
用法:
<my-directive on-post-link="directiveAccessor=$event">
</my-directive>
一定要null
销毁隔离作用域时的引用。否则代码有造成内存泄漏的风险。
我正在编写一个 AngularJS 1.x 指令(我们称之为 MyDirective
)。其范围声明如下:
scope: {
accessor: '='
}
在其 link
函数中,我将一个新对象分配给 accessor
字段,如下所示:
scope.accessor = {
// methods such as doSomethingToMyDirective()
};
现在,我用 $compile
:
var element = $compile('<div data-my-directive data-accessor="directiveAccessor"></div>')(myScope);
一旦它有 运行,我当前的作用域 (myScope
) 就有一个 directiveAccessor
属性 引用在指令中创建的对象实例。
问题:此字段不能立即可用。
换句话说,一旦我有运行 $compile
,我不能在下一个命令中立即访问myScope.directiveAccessor
。当我稍后检查范围时,该字段就在那里,可能一个 $timeout
就足够了。
通过一些断点,我可以观察到对象确实是在执行 $compile
时创建的;内部作用域上的 accessor
已经指向该对象。但是,似乎将值从内部范围的 accessor
复制到 myScope.directiveAccessor
的双向绑定直到稍后才会激活。
有没有办法强制AngularJS立即复制双向绑定值(即不等待任何承诺)?
使用表达式绑定(&
)立即设置父作用域变量:
app.directive("myDirective", function () {
return {
scope: { onPostLink: "&" },
link: postLink
};
function postLink(scope, elem, attrs) {
scope.accessor = {
doSomethingToMyDirective: function() {
return "Hello world";
}
};
scope.onPostLink({$event: scope.accessor});
scope.$on("$destroy", function() {
scope.onPostLink({$event: null});
});
}
})
用法:
<my-directive on-post-link="directiveAccessor=$event">
</my-directive>
一定要null
销毁隔离作用域时的引用。否则代码有造成内存泄漏的风险。