我决定像单独的小部件一样创建组件,例如parent将配置传递给它,组件获取数据(父节点不需要来自子节点的数据)。但在某些情况下,例如父级中的某些更新,可能会影响显示的数据。所以我想对孩子说:重新获取数据,而配置保持不变。但这不会导致$onChanges
回调触发,因为配置对象的链接是相同的,所以我以一种hacky方式修复它:
vm.childConfig = _.assign({}, vm.childConfig);
这对我来说很好,但很难看。有没有更好的解决方案呢? (创建$ watch,发出事件似乎是更糟糕的解决方案)
一些示例代码:
<parent-component>
<child-component config="childConfig"></child-component>
</parent-component>
JS:
function ParentComponentController () {
vm.childConfig = {show: true, ...}
vm.onItemDelete = function () {
vm.childConfig = _.assign({}, vm.childConfig); // I want to call `fetchData` so I force child $onChanges to fire.
}
}
function ChildComponentController () {
vm.$onInit = function () {
fetchData()
}
vm.$onChanges = function () {
// will not fire if will not change the config object reference
fetchData(changes)
}
}
所以我想要强迫孩子来调用$onChanges
P.S。我不喜欢让孩子成为愚蠢组件的想法(父母将获取的数据传递给它),当然它会解决这个问题,但数据只在孩子中需要,它会使父组件均匀胖。
答案 0 :(得分:1)
这是你的意思吗?
JS
angular.module("app")
.component(
"ChildComponent",
{
controller: ChildComponentCtrl,
bindings: {
config: "<",
update: "<"
}
}
);
function ChildComponent () {
var init = false;
function init() {
// Set up config
init = true;
}
function update() {
// config remains the same but do something else
}
this.$onChanges = function () {
if (angular.isDefined(this.config) && !init) {
init();
}
else if (angular.isDefined(this.update)) {
update();
}
};
}
标记
<parent-component>
<child-component config="childConfig" update="update"></child-component>
</parent-component>
修改 - 要确保多次更新有效,请执行以下操作:
ChildComponent
this.$onChanges = function () {
if (angular.isDefined(this.config) && !init) {
init();
}
else if (angular.isDefined(this.update) && update) {
update();
}
};
为父级
function doUpdate() {
this.update = true;
// Rest update so that it works next time
$timeout(function () {
this.update = false;
});
}