2013-12-04 4 views
0

Я определил функцию подписки в нокауте следующим образом:Нокаут функция подписки прикрепить к списку свойств

// subscriber for autosave function that is within handler 
ko.subscribable.fn.withAutoSave = function (prop, handler) { 
    var self = this; 

    //subscribe to changes 
    this.subscribe(handler.bind(this, self, prop)); 

    return this; 
}; 

и это, как я придаю это имущество:

self.CompanyName = ko.observable(data.CompanyName).withAutoSave("CompanyName", saveFieldValueFunction.bind(this, this.Id));  

Есть способ и правильный синтаксис, с помощью которого я могу сделать что-то вроде этого:

1) define propertyname array: var propertynames = ['CompanyName', 'Property1', 'Property2' ...];

2) цикл через все propertynames и подписаться: withAutoSave(propertyName, saveFieldValueFunction.bind(this, this.Id));

я опишу, почему мне это нужно: У меня есть модель, которая определяется вызывается из 2-х различных форм. Я могу повторно использовать его, но для одной формы мне нужно иметь «withUpdateSave», но для другой формы мне это не нужно. Поэтому я хочу, чтобы какой-то вариант определял, нужно ли мне это или нет.

ответ

1

Путь наименьшего сопротивления, вероятно, состоит в том, чтобы добавить логический параметр в withAutoSave, который определяет, действительно ли он должен что-либо делать, а затем привязать его к наблюдаемому свойству в вашей модели просмотра, которую вы устанавливаете или очищаете в коде, который показывает форму , например

ko.subscribable.fn.withAutoSave = function (prop, handler, enabled) { 
    var self = this; 
    this.subscribe(function() { 

//  if (enabled()) { 
// UPDATED: use ko.unwrap() so enabled can be 
// either an observable or an ordinary value 

    if (ko.unwrap(enabled)) { 
     handler.call(self, self, prop); 
    } 
    }); 
    return this; 
}; 

, а затем:

self.CompanyName = ko.observable(data.CompanyName).withAutoSave("CompanyName", saveFieldValueFunction.bind(this, this.Id), self.doAutoSave); 

затем self.doAutoSave(true) позволит автосохранение и self.doAutoSave(false) отключит его

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