在计算compute()时调用依赖的observable

时间:2012-09-28 14:08:29

标签: javascript knockout.js

我有计算函数,它应该基本上监听可观察数组(Items)中的任何变化。问题是Knockout在初始化时调用了这个函数。我知道它是为了弄清楚它的依赖关系,但在我的情况下,这是一个问题,因为它产生ajax请求。是否有任何解决方案除了引入一些计数器变量以跳过第一次调用时调用ajax? 感谢。

function MyViewModel(data) {
    var self = this;
    self.nameToAdd = ko.observable("");
    self.Items = ko.observableArray(data.items || []);

    self.add = function () {
        self.Items.push({ Name: self.nameToAdd()});
        self.nameToAdd("");
    };

    self.remove = function (item) {
        self.Items.remove(item);
    };

    ko.computed(function () {
        $.ajax({
            url: "myUrl",
            type: 'POST',
            data: ko.toJSON(self.Items),
            contentType: 'application/json'
        });
    }, self);
}

1 个答案:

答案 0 :(得分:1)

我认为您真正想要的是手动订阅您的Items数组,以便在更新时调用ajax函数。

self.Items.subscribe(function(){
    $.ajax({
        url: "myUrl",
        type: 'POST',
        data: ko.toJSON(self.Items),
        contentType: 'application/json'
    });
});

传递的函数只有在数组本身发生更改时才会被调用,因此,在初始化时不会被调用。例如,请参阅fiddle