Javascript AngularJS 1.5组件赢得';t在更改时调用$onChanges

Javascript AngularJS 1.5组件赢得';t在更改时调用$onChanges,javascript,html,angularjs,components,angularjs-components,Javascript,Html,Angularjs,Components,Angularjs Components,我在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, bi

我在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;
    };
}
angular.module(“bla”).component(“myComp”{
templateUrl:“/my comp.tpl.html”,
控制器:myController,
绑定:{

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

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

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

选项1:仅绑定到属性

如果父控制器/组件仅更改一个或多个属性,则使用

<my-comp standards-data-something="standardsData.something"></my-comp>
更改引用


进一步阅读,您可能会发现有趣的内容:


谢谢您的回答!实际上我不认为这是因为standardsData是一个对象。应用程序中有两种情况:1.我们单击某个链接并路由到此屏幕。执行此操作时,onChanges事件中没有任何活动。(只有onInit)…2.在这一点上,当我刷新页面时(如F5),onChanges事件开始生效。知道吗?谢谢!@moshi-有两件事导致
$onChanges
触发:1)当组件首次初始化时,2)当父级对绑定进行更改时。F5刷新会使您从初始化时看到更改活动。您再也看不到它,因为您已绑定到不会更改的对象引用。如果您愿意,我将删除我的(正确)答案。感谢您的回答。我同意您的观点,$onChanges发生在初始化时。我看不出它总是发生在数据更改时。就像我刷新页面并单击菜单项时一样(每个菜单项都会为该组件加载新数据)-一切都很顺利。每次单击都会发生$onChanges。但是-当我转到另一个页面并单击指向我的页面(包含组件的页面)的链接时,我的组件$onChanges不会启动,尽管我刷新了数据。然后,无论我点击任何菜单,它都不会在我的组件上引起$onChanges。顺便说一句,关于对象引用问题,在将数据加载到$scope.standardsData之前,我也尝试过这样做:$scope.standardsData=null$scope.standardsData=new object…..没有change.BTW-我喜欢你的答案,我没有任何问题可以标记为答案。再次感谢:-)另一个页面?听起来你的应用程序的设计有一些重大问题,这个问题可能根本与
$onChanges
无关。如果不查看整个应用程序,我无法进一步帮助你。无需标记为答案如果它不能解决你的问题。
bindings: {
    standardsDataSomething: '<'
}
standardsData = {newData};  //Reset the new data from http or wherever