javascript - 在评估 computed() 时调用的依赖可观察对象

标签 javascript knockout.js

我有计算函数,它基本上应该监听可观察数组(项目)中的任何变化。问题是 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);
}

最佳答案

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

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

传递的函数只会在数组本身发生变化时调用,因此不会在初始化时调用。参见 fiddle例如。

关于javascript - 在评估 computed() 时调用的依赖可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12641635/

相关文章:

javascript - 来自 JSON 对象的动态 Knockout 表

javascript - 在 KnockoutJS 中销毁自定义订阅

javascript - setInterval 函数仅工作一次

javascript - 如何以 ECMAScript 2015 方式正确导入带有 Backbone-boilerplate 的 HighCharts?

javascript - 如何在 JavaScript 字符串中使用\n

knockout.js - ajax调用成功后将viewmodel绑定(bind)到ui

javascript - Firebase:orderByKey是否返回有序快照

javascript - extjs,是否可以压缩加载ext-all.js?

javascript - 集合教程中的 ko.observable 变量

javascript - 类似于 Prism for Knockout js 的框架