0

我想将一个数组(或 observableArray)传递给一个复合对象,如下所示:

<add-training-modal id="modal" employees="[[data]]"></add-training-modal>

data通过异步调用在关联的 viewModel 中检索:

self.data = ko.observableArray();
UserFactory.getUsers().then(arr => {
    self.data(arr);
})

问题:[[data]]在异步调用完成之前传递给组合。只要data在复合材料中更新就可以了。然而,这种情况并非如此。

在复合视图模型中:

function model(context) {
    //...
    context.props.then(function (propertyMap) {
        self.properties = propertyMap;
        console.log(propertyMap.employees); // is empty []

        setTimeout(function () {
            console.log(propertyMap.employees); // is full [...]
        }, 500);
    });
}

model.prototype.attached = function(context) {
   context.props.then(function (propertyMap) {
       console.log(propertyMap.employees); // is empty []
   });
};    

我知道我可以从组合中检索数据。但这不是根本问题的答案。

4

2 回答 2

2

换句话说,组合需要监听更改事件,对吗?添加此代码:

self.composite = context.element;
$(self.composite).on('employees-changed', function (event) {
    if (event.detail.updatedFrom === 'external') {
        console.log(event.detail.value);
    }
});

在最新版本中(我自己没有测试过):

model.prototype.attached = function(context) {
    self.composite = context.element;
    self.composite.addEventListener('employeesChanged',function(event){
        if (event.detail.updatedFrom === 'external'){
            console.log(event.detail.value);
        }
    });
};

有关更多信息,请查看此博客:https ://blogs.oracle.com/groundside/jet-composite-components-v-events

它是有关 Oracle-JET 复合材料的权威指南。

于 2018-04-18T02:03:39.863 回答
1

雷的回答可以解决问题。

还有另一种解决方案。它需要 2018 年 4 月 16 日发布的 JET v5.0.0+。它带有一种新的复合生命周期方法,称为propertyChanged(context). 你可以像这样使用它:

model.prototype.propertyChanged = function(context){
    if (context.property === 'employees') {
        this.employees(context.value);  
    }
};

(升级到 v5.0.0 时请注意此问题。)

于 2018-04-18T09:44:28.943 回答