2013-10-09 4 views
1

Извините, если это было задано раньше, я искал, но мне очень сложно выразить свою проблему в дружеском поиске. И я не могу понять это из документации нокаута, однако это похоже на основной вопрос.Проводка вызова AJAX в Knockout.js

У меня есть 3 списка избранного и модель нокаута. При выборе значения в первом списке обновляется наблюдаемое в модели представления. Затем мне нужно сделать сообщение ajax, отправив это значение на сервер и получив список значений, которые я помещаю в наблюдаемый массив в модель представления, который, в свою очередь, обновит остальные 2 списка.

Я доволен проводкой до наблюдаемых, и эта часть работает нормально, мой вопрос заключается в том, как и где запускать вызов ajax.

Если я вызываю его при событии изменения первого выбора, это, по-видимому, вызывает состояние гонки, что означает, что он иногда вызывается до того, как обновилась модель просмотра. Я мог бы вызвать его, не используя наблюдаемые, но это не кажется очень нокаутированным.

Если я использую пользовательскую привязку для извлечения значений, это приведет к тому, что вызов ajax будет сделан дважды, и я не могу поместить извлечение в функцию, потому что он должен выполняться асинхронно (и он будет вызываться дважды).

Мне кажется, что мне нужно что-то, что слушает наблюдаемое и запускает вызов ajax без какого-либо визуального элемента.

Любая помощь будет с благодарностью принята.

+0

Общим примечанием. Извлечение данных с сервера, не изменяющего данные на этом сервере, подразумевает запрос GET, а не запрос POST. – Tomalak

+0

Да, в действительности есть немного больше. Я просто дошел до самых простых фактов. Ваш ответ ниже - именно то, что я искал. Благодарю. –

+0

К сожалению, похоже, что существует целая группа RESTless API, которые используют POST для всего, включая запросы. Это в конечном итоге приводит к проблемам масштабирования, потому что становится невозможным легко сказать, что можно или не может кэшировать. – ebohlman

ответ

4

Пусковые вещи, которые должны произойти в ответ на изменение модели, обычно работают через subscriptions в нокауте.

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"); 
     });   
    }); 
} 
+0

Бинго, это именно то, на что я надеялся, спасибо! –

Смежные вопросы