2012-05-04 2 views
0

следил за документами, пытался самостоятельно и сталкивался с некоторыми проблемами.noob issue about knockout.js и scope

initializeViewModel = function(){ 

    var listing_model = { 
     sale_rent: ko.observable(jQuery('#id_sale_rent')), 
     property_type: ko.observable(jQuery('#id_property_type').val()), 
     address: ko.observable(jQuery('#id_address')), 
     is_condo: ko.computed(function(){ 
      return this.property_type() == 'condominium'; 
     }, this) 
    }; 



    listing_model.district = ko.computed(function(){ 

     return this.district() || this.property_type(); 
    }, listing_model); 

    return listing_model; 
} 

Оператор return this.property_type() == 'condominium'; вызывает исключение object <object> has no method property_type(). Я думаю, что это может быть проблемой, но this, похоже, ссылается на правильный экземпляр здесь. Может ли кто-нибудь указать мою проблему?

ответ

2

Чистейший решение использовать анонимную функцию (создать замыкание), а не простой объект:

initializeViewModel = function(){ 
    var listing_model = new function() { 
     // Close-in a reference to this object 
     var self = this; 

     self.sale_rent = ko.observable(jQuery('#id_sale_rent')); 
     self.property_type = ko.observable(jQuery('#id_property_type').val()); 
     self.address = ko.observable(jQuery('#id_address')); 

     self.is_condo = ko.computed(function() { 
      return (self.property_type() == 'condominium'); 
     }); 
    }(); 

    // ... 

В противном случае «это» внутри функции (что определяет вычисленное) относится все, что вы 'передается как второй параметр ko.computed() - значение «this» есть текущий контекст, в котором выполняется «initializeViewModel», поэтому, если вы вызываете эту функцию как обычно (то есть initializeViewModel()), « это «будет просто ссылкой на глобальный объект, а не на« listing_model »(как ожидалось/предполагалось).

Пример в руководстве отличается от вашего кода: вы создаете простой объект сразу, а в руководстве все обернуто функцией. Вызов этой функции с помощью «нового» ключевого слова создает новый объект и устанавливает контекст («это») этому объекту. Вот почему их код работает.

+0

ahh ... enlightening. .. спасибо @Niko. Я попробую. – goh

+0

Вопрос .. Почему мое сообщение об ошибке в chrome не передает это как domwindow? – goh

+0

Простите, пожалуйста, перефразируйте это? Где вы ожидаете, что «это» будет объектом domwindow? – Niko

0

Ну, this относится к области анонимных функций, а во-вторых this.property_type() - вызов функции, который вы не можете присвоить переменной.

+0

Хорошо, что я следовал инструкциям в документах http://knockoutjs.com/documentation/computedObservables.html, он говорит, что передача этого параметра в качестве параметра ko.computed относится к самому объекту listing_model, – goh