Javascript 在Knockout.js中连接AJAX调用

Javascript 在Knockout.js中连接AJAX调用,javascript,ajax,knockout.js,Javascript,Ajax,Knockout.js,道歉如果以前有人问过,我已经搜索过了,但我发现很难用搜索友好的方式表达我的问题。我无法从淘汰文档中找到答案,但这似乎是一个基本问题 我有3个选择列表和一个淘汰视图模型。在第一个列表中选择一个值将更新视图模型中的可观测值。然后,我需要制作一篇ajax文章,将该值发送到服务器并检索一个值列表,我将这些值放入视图模型中的一个可观察数组中,这将反过来更新其他两个列表 我很高兴连接到可观察对象,这部分工作正常,我的问题是如何以及在哪里触发ajax调用 如果我在第一次选择的更改事件中触发它,它似乎会导致竞争

道歉如果以前有人问过,我已经搜索过了,但我发现很难用搜索友好的方式表达我的问题。我无法从淘汰文档中找到答案,但这似乎是一个基本问题

我有3个选择列表和一个淘汰视图模型。在第一个列表中选择一个值将更新视图模型中的可观测值。然后,我需要制作一篇ajax文章,将该值发送到服务器并检索一个值列表,我将这些值放入视图模型中的一个可观察数组中,这将反过来更新其他两个列表

我很高兴连接到可观察对象,这部分工作正常,我的问题是如何以及在哪里触发ajax调用

如果我在第一次选择的更改事件中触发它,它似乎会导致竞争条件,这意味着它有时会在视图模型更新之前被调用。我可以在不使用可观察物的情况下触发它,但这似乎并不太令人惊讶

如果我使用自定义绑定来检索值,它将导致ajax调用两次,并且我不能将检索放在函数中,因为它需要异步运行,并且会被调用两次

我觉得我需要一种能够监听可观察到的并触发ajax调用的东西,而不需要任何视觉元素


我们将非常感激您的帮助。

触发视图模型更改时应该发生的事情通常在击倒中起作用

function ViewModel() {
    var self = this;

    self.someValue = ko.observable();
    self.otherValue = ko.observable();

    self.someValue.subscribe(function (newValue) {
        // do something with newValue, like an Ajax request.

        // assuming jQuery
        $.get("your/url", {val: newValue})
        .done(function (data) {
            self.otherValue(data);
        })
        .fail(function () {
            alert("could not retrieve value from server");
        });           
    });
}

为了响应视图模型的更改而触发应该发生的事情通常在击倒中起作用

function ViewModel() {
    var self = this;

    self.someValue = ko.observable();
    self.otherValue = ko.observable();

    self.someValue.subscribe(function (newValue) {
        // do something with newValue, like an Ajax request.

        // assuming jQuery
        $.get("your/url", {val: newValue})
        .done(function (data) {
            self.otherValue(data);
        })
        .fail(function () {
            alert("could not retrieve value from server");
        });           
    });
}

宾果,这正是我所希望的,谢谢!宾果,这正是我所希望的,谢谢!总的来说:从一个不改变服务器上数据的服务器检索数据意味着一个GET请求,而不是POST请求。是的,实际上还有一点。我只讲了最简单的事实。你下面的答案正是我想要的。谢谢。不幸的是,似乎有一大堆不安的API在那里使用POST处理所有事情,包括查询。这最终会导致伸缩性问题,因为很难判断哪些内容可以缓存,哪些内容不能缓存。请注意:从服务器检索数据时,如果该服务器上的数据没有更改,则意味着GET请求,而不是POST请求。是的,实际上还有一点。我只讲了最简单的事实。你下面的答案正是我想要的。谢谢。不幸的是,似乎有一大堆不安的API在那里使用POST处理所有事情,包括查询。这最终会导致伸缩性问题,因为很难判断哪些可以缓存,哪些不能缓存。