2013-09-10 2 views
1

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

Мне нужно отслеживать 100 объектов, свойства которых изначально нулевые. Каждый из этих объектов 100 может быть описана одной и той же модели представления:

 var myViewModel = { 
      personName: ko.observable(null), 
      personAge: ko.observable(null) 
     }; 


     var my100 = { 
     a1: myViewModel, 
     a2: myViewModel, 
     . 
     . 
     . 
     a100: myViewModel 

     } 

Второй аргумент функции подписки() «определяет значение этой в функции обратного вызова». http://knockoutjs.com/documentation/observables.html

Я не уверен, что входит во второй аргумент, когда мне нужно знать, какой из этих 100 объектов изменился. Когда какое-либо свойство в модели просмотра изменяется от нуля до значения или из одного значения в другое значение, Я хочу знать, какой объект произошел в, например. a88.

  myViewModel.personName.subscribe(myCallback, ?, "change"); 
      myViewModel.personAge.subscribe(myCallback, ?, "change"); 

Зная, какое свойство было изменено бы тоже хорошо, но это более важно, что я знаю, что объект, свойство которого изменилось.

ответ

0

Может быть проще сохранить ссылку на модель представления в пределах правильной области, поэтому она доступна для обратного вызова. Это немного более читаемым, если вы строите вашу модель представления с помощью функции конструктора:

var Person = function() { 
    var self = this; 

    self.personName = ko.observable(null); 
    self.personAge= ko.observable(null); 

    self.personName.subscribe(function(newValue) { 
     // "self" is a variable reference to the correct Person here 
     // newValue is the new value for the observable 
     // calling "myCallback" here allows you to pass those at your leisure 
    }); 
}; 

См this fiddle для того, как это будет работать.

PS. Если обратный вызов короткий, вам может даже не понадобиться отдельная функция myCallback, просто выполните работу внутри функции, встроенной в вызов subscribe, где у вас уже есть ссылка на правильное значение this (хранящееся в переменной self).

+0

Отлично и ясно, спасибо большое. – Tim

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