【问题标题】:Force Two-Way-Binding to Take Effect强制双向绑定生效
【发布时间】:2019-03-10 23:49:18
【问题描述】:

我正在编写一个 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 立即复制双向绑定的值(即无需等待任何承诺)?

【问题讨论】:

  • 您应该访问生命周期方法 $onInit 和 $onChanges 中的绑定变量,例如。 docs.angularjs.org/guide/component -- 请注意这些适用于任何控制器,而不仅仅是组件控制器。

标签: javascript angularjs angularjs-directive


【解决方案1】:

使用表达式绑定 (&amp;) 立即设置父范围变量:

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 将值从内部范围复制到外部范围,而是发送一个回调,该回调会立即提供该值并可以立即将其保存到外部范围。今天试试!
猜你喜欢
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 2011-02-20
  • 2015-04-26
  • 2016-04-19
  • 2012-05-25
  • 1970-01-01
相关资源
最近更新 更多