强制双向绑定生效

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销毁隔离作用域时的引用。否则代码有造成内存泄漏的风险。