【问题标题】:AngularJS 1.5 component won't invoke $onChanges upon changeAngularJS 1.5 组件在更改时不会调用 $onChanges
【发布时间】:2017-06-15 14:19:46
【问题描述】:

我在 html 页面中有一个 AngularJS 1.5 组件(不是父组件) 并且组件不会在更改时调用 $onChanges。

HTML

<my-comp standards-data="standardsData"></my-comp>

组件

angular.module("bla").component('myComp', {
    templateUrl: '/my-comp.tpl.html',
    controller: myController,
    bindings: {
        standardsData: '<'
    }
});

function myController() {
    var self = this;

    self.$onInit = function () {
        self.standardsData = {};
    }

    self.$onChanges = function (changes) {
        self.standardsData.something = changes.standardsData.currentValue.something;
    };
}

当我在包含我的组件的 html 的 ctrl 中获取新数据时, 它不会影响组件。我只进入组件的$onInit$scope.standardsData 更改之后(在包含的html/ctrl 中), 我的组件的$OnChanges 不会调用。

希望我正确描述了问题, 谢谢!

【问题讨论】:

    标签: javascript html angularjs components angularjs-components


    【解决方案1】:

    你的组件绑定到standardsData 是一个对象引用的绑定,即使它的一个属性被修改,它也不会改变。因此,$onChanges 不会被触发。这是因为$onChanges 使用了浅$watch

    换句话说,$onChanges 仅在我们使用原语(即非对象)或更改绑定到组件中的javascript对象的引用时才会触发

    因此,您需要:1) 手动绑定到所需的属性,而不是对象引用,或者 2) 在其数据更改时更改整个 standardsData 对象。 你也可以 3) 重写 $onChanges 功能,我想(不推荐)

    选项 1:仅绑定到属性

    在父控制器/组件仅更改一个或多个属性时使用。

    <my-comp standards-data-something="standardsData.something"></my-comp>
    

    bindings: {
        standardsDataSomething: '<'
    }
    

    选项 2:更改引用

    在父控制器/组件获得全新的standardsData 时使用。您将为此选项保留当前的 ​​HTML 并设置:

    standardsData = {newData};  //Reset the new data from http or wherever
    

    更改引用。


    一些你可能会感兴趣的进一步阅读:

    http://blog.kwintenp.com/the-onchanges-lifecycle-hook/

    http://www.codelord.net/2016/12/20/replacing-angulars-deep-watches-with-the-%24docheck-lifecycle-hook/

    【讨论】:

    • 感谢您的回答!其实我不认为这是因为standardsData是一个对象。应用中有两种情况: 1. 我们点击某个链接并路由到这个屏幕。这样做时,onChanges 事件中没有任何活动。 (仅 onInit)... 2. 在这一点上,当我刷新页面(如 F5)时,onChanges 事件开始生效。任何想法 ?谢谢!
    • @moshi - 有两件事会导致$onChanges 触发:1) 当组件首次初始化时,2) 当父级对绑定进行更改时。 F5 刷新使您看到初始化的更改活动。你再也看不到它了,因为你已经绑定了一个不会改变的对象引用。如果你愿意,我会删除我的(正确)答案。
    • 感谢您的回答。我同意你的观点,$onChanges 在初始化时发生。我没有看到它总是发生在数据更改时。就像我刷新页面并单击菜单项(每个菜单项都为该组件加载新数据)时一样 - 一切都很好。对于每次点击 - $onChanges 都会发生。但是-当我转到另一个页面并单击指向我的页面的链接(包含该组件的页面)时,尽管我刷新了数据,但我的组件 $onChanges 不会触发。然后,无论我点击任何菜单 - 它都不会在我的组件上导致 $onChanges。
    • BTW - 关于对象引用问题,在将数据加载到 $scope.standardsData 之前,我也尝试这样做: $scope.standardsData = null $scope.standardsData = new Object.....没有变化。顺便说一句 - 我喜欢你的回答,我没有任何问题可以标记为答案。再次感谢:-)
    • 另一页?听起来您的应用程序设计存在一些重大问题,并且该问题可能与 $onChanges 根本无关。如果没有看到整个应用程序,我将无法进一步帮助您。如果不能解决您的问题,无需标记为答案。
    猜你喜欢
    • 2016-10-04
    • 2016-06-06
    • 2017-07-05
    • 1970-01-01
    • 2018-02-21
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多