У меня есть форма с наборами данных. Когда я нажимаю на набор (или строку), он заполняет форму этим набором данных.Нокаут PureComputed Invoked Subscribers при воссоздании
Для каждого набора у меня есть объект pureComputed, который будет обновлять базу данных всякий раз, когда изменяется один из входов.
Это прекрасно работает, за исключением того, что pureComputed вызывает обновление при нажатии на другой набор. Я ожидаю, что этого не произойдет, потому что я создаю набор входов с помощью конструктора, и поэтому я по существу заменяю все наблюдаемые и их свойства pureComputed.
Например:
var Form = function (data) {
var $this = this;
$this.value1 = ko.observable(data.value1);
$this.value2 = ko.observable(data.value2);
$this.model = ko.pureComputed(function() {
return {
value1: $this.value1(),
value2: $this.value2(),
};
}).extend({ updateModel: url });
};
//Inside some module
var self = this;
self.viewmodel = {};
var load = function (url) {
$.ajax({
url: url, //etc
}).done(function (response) {
self.viewmodel.form(new Form(response));
});
};
load('www.myapi.com/1');
var onClick = function() {
load('www.myapi.com/2');
};
Кроме того, обновление не вызывается при загрузке страницы. Почему он вызывается, когда я нажимаю на новую строку?
EDIT: UpdateModel код ...
ko.extenders.updateModel = function (target, options) {
var url = options;
target.subscribe(function (model) {
$.ajax({
url: url,
}).done(function (response) {
/* not setting any observables */
});
};
return target;
};
EDIT 2: выше на самом деле работает в моем коде. Я сузил преступника до привязки нокаута для выпадающего списка.
Часть каждой формы является выпадающим списком. Я использую встроенные привязки нокаута для раскрывающегося списка, и я включаю местозаполнитель. Если выпадающее значение равно null или 0, значение вызывает вызовы. Если он больше 0, то это штраф.
Можете ли вы показать, что делает 'updateModel'? –