0

У меня есть форма с наборами данных. Когда я нажимаю на набор (или строку), он заполняет форму этим набором данных.Нокаут 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, то это штраф.

+0

Можете ли вы показать, что делает 'updateModel'? –

ответ

1

Я взял ваш код и создал рабочую версию здесь. Он не запускает функцию обновления, если значения не изменены. Другими словами, «щелчок» ничего не обновляет.

ko.extenders.updateModel = function (target, options) { 
 
    var url = options; 
 

 
    target.subscribe(function (foo) { 
 
    console.log(url, foo); 
 
    }); 
 

 
    return target; 
 
}; 
 

 
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: data.url }); 
 
}; 
 

 
//Inside some module 
 
var vm = {}; 
 
vm.viewmodel = { 
 
    form: ko.observable() 
 
}; 
 

 
var counter = 0; 
 
var load = function (url) { 
 
    url = url + (++counter); 
 
    setTimeout(function() { 
 
    vm.viewmodel.form(new Form({ 
 
     value1: "1"+counter, 
 
     value2: "2"+counter, 
 
     url: url 
 
    })); 
 
    }, 100); 
 
}; 
 

 
load('www.myapi.com/'); 
 

 
vm.onClick = function() { 
 
    load('www.myapi.com/'); 
 
}; 
 

 
ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script> 
 
<div data-bind="with: viewmodel.form"> 
 
    <input data-bind="value: value1"> 
 
    <input data-bind="value: value2"> 
 
</div> 
 
<button type="button" data-bind="click: onClick">click</button>

+0

Это здорово! Это то, что я делаю, но продолжаю получать обновления. Мое реальное решение использует сетку кендо для заполнения сетки, и щелчок по строкам заполняет форму. Я думаю, мне просто нужно прочесать весь код (снова) и убедиться, что я не делаю ничего, что могло бы вызвать подписку. :/ – christo8989

+0

Я обнаружил проблему. Это не связано с этим. Это в большей степени связано с привязками к нокауту для опций с помощью заполнителя. Anywho, я должен удалить этот вопрос? – christo8989

+0

Я понял. Я инициализировал значение раскрывающегося списка равным null вместо undefined, и поэтому значение действительно менялось от нуля до неопределенного. – christo8989