2017-02-20 1 views
1

Я использую asp.net mvc с нокаутом для привязки данных. У меня есть три модели просмотра, которые, как показано ниже:В программе, использующей knockout.js с несколькими ViewModels, как узнать, какая конкретная модель просмотра изменяется путем изменения свойства?

function PersonViewModel() { 
     this.firstName = ko.observable("@Model.FirstName"); 
     this.lastName = ko.observable("@Model.LastName"); 
    } 
    function ContactViewModel() { 
     this.homePhone = ko.observable("@Model.HomePhone"); 
     this.mobile = ko.observable("@Model.Mobile"); 
    } 

    function AddressViewModel() { 
     this.city = ko.observable("@Model.City"); 
     this.street = ko.observable("@Model.Street"); 
    } 

var pvm = new PersonViewModel(); 
    var avm = new AddressViewModel(); 
    var cvm = new ContactViewModel(); 
    var pNode = $("#personal-information").get(0); 
    var aNode = $("#address-information").get(0); 
    var cNode = $("#contact-information").get(0); 
    ko.applyBindings(pvm, pNode); 
    ko.applyBindings(avm, aNode); 
    ko.applyBindings(cvm, cNode); 

Html, как показано ниже:

<div id="personal-information"> 
    <input data-bind="value: firstName" type="text" > 
    <input data-bind="value: lastName" type="text" > 
</div> 
<div id="contact-information"> 
    <input data-bind="value: homePhone" type="text" > 
    <input data-bind="value: mobile" type="text" > 
</div> 
<div id="address-information"> 
    <input data-bind="value: city" type="text" > 
    <input data-bind="value: street" type="text" > 
</div> 

Значение по умолчанию для этих полей ввода выбирается из 3-х различных таблиц в базе данных. Я хочу редактировать эти значения и обновлять данные в этих таблицах.

Если я изменяю значение входов только в PersonViewModel, я хочу сделать запрос ajax, который будет вызывать запрос на обновление только для таблицы person. И то же самое для адреса и контакта ViewModel. Я знаю, как сделать запрос ajax.

Но моя проблема: использование knockoutJs, как я могу знать, что только те конкретные ViewModels, которые обновляются, чтобы я мог оставить остальное на нем?

ответ

0

Для каждой модели просмотра вы можете создать метод, к которому могут подписаться другие наблюдаемые. Так, например, для PersonViewModel:

function PersonViewModel() { 
    this.firstName = ko.observable("@Model.FirstName"); 
    this.lastName = ko.observable("@Model.LastName"); 

    this.updatePerson = function() { /* AJAX */ }; 

    // subscriptions 
    this.firstName.subscribe(this.updatePerson); 
    this.lastName.subscribe(this.updatePerson); 
} 

Таким образом, всякий раз, когда значение Firstname или ЬавЬЫате изменяет updatePerson метод будет вызван.

Та же идея для других моделей просмотреть

function ContactViewModel() { 
    this.homePhone = ko.observable("@Model.HomePhone"); 
    this.mobile = ko.observable("@Model.Mobile"); 

    this.updateContact = function() { /* AJAX */ }; 

    // subscriptions 
    this.homePhone.subscribe(this.updateContact); 
    this.mobile.subscribe(this.updateContact); 
} 

function AddressViewModel() { 
    this.city = ko.observable("@Model.City"); 
    this.street = ko.observable("@Model.Street"); 

    this.updateAddress = function() { /* AJAX */ }; 

    // subscriptions 
    this.city.subscribe(this.updateAddress); 
    this.street.subscribe(this.updateAddress); 
} 
+0

Это очень полезно. Спасибо Рафаэлю. Работает над тем, что я хочу делать. Но есть ли способ сделать это, не вызывая подписку (this.update ...) для каждого из наблюдаемых? Простая настройка, позволяющая обрабатывать все сама по себе, а не тот же код для каждого из наблюдаемых, - это то, что я ищу сейчас. – Prabesh

+0

Вы можете использовать вычисленное наблюдение, которое «прослушивает» изменения в нескольких других наблюдаемых, а затем подписывается только на это, вычисленное на наблюдаемый метод обновления - http://stackoverflow.com/a/9278782/1942895 –

+0

Теперь я обнаружил, что эта работа только с , когда я использую