强制KO自动更新

时间:2014-06-21 23:04:47

标签: javascript knockout.js

所以我有两个viewModel,一个在observable中有一个文档样式数据库:

var databaseViewModel = function () {
    var self = this;
    self.database = ko.observableArray([]).publishesTo("database");
}

var calcViewModel = function () {
    var self = this;

    self.replicatedDatabase = ko.observableArray([]).subscribeTo("database");
}

这些因此得到应用:

ko.applyBindings({
    databaseViewModel: new databaseViewModel(),
    calcViewModel: new calcViewModel()
});

唯一的问题是,与replicatedDatabase绑定的下拉框不会显示任何项目。我知道我可以强制进行绑定更新:

database.valueHasMutated();

但我不知道何时何地。

我在ko.applyBindings之后尝试过但是,我不确定如何访问新创建的databaseViewModel。我已经在databaseViewModel创建了内部后尝试过,但我相信KO会​​在绑定时自动更新绑定,所以不确定这实际上是否有所作为,它没有在下拉列表中显示反正。

我不确定我应该在这做什么。

供参考,我使用knockout-postbox进行消息总线式通信,subscribeTopublishesTo。因此,只要database observable被更改,它就会通知所有订阅者,因此我认为在replicatedDatabase启动的实例中可能会更新databaseViewModel

1 个答案:

答案 0 :(得分:0)

所以,不是强迫淘汰更新值,而是选择了不同的方法。

实际上,该页面最初将填充来自服务器的一些数据,因此我考虑到这一点,然后创建一个包含初始数据的全局变量:

var serverData = [{}];

然后只需使用Ryan Niemeyer映射函数填充observableArray

ko.observableArray.fn.map = function ( data, Constructor) {
    var mapped = ko.utils.arrayMap(data, function (item) {
        return new Constructor(item);
    });

    this(mapped);

    return this;
};

这样两个viewModel都从初始数据开始,当数据库viewModel得到更新时,这会渗透到其他viewModel&#39}