2013-07-16 5 views
0

рассмотривать если мы хотим переопределить функцию для конкретного объекта (не в подклассе):наиважнейшая не ko.computed работает

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

    self.hello = ko.computed(function() { 
    return 'Not implemented hello'; 
    }); 

    self.greeting = ko.computed(function() { 
    return self.hello() + '!!'; 
    }); 
}; 

var dog = new Animal(); 
dog.hello = ko.computed(function() { 
    return 'Wooff'; 
}); 
console.log(dog.greeting()); 

Я ожидал, что выход будет: Wooff!!

Но это было : Not implemented hello!!

Вот jsbin где я реализовал это на простом JavaScript, который работает и в нокауте, который не делает: http://jsbin.com/uyilot/1/edit

** редактировать **

jsbin раствором Райана (сейчас работает!): http://jsbin.com/uyilot/2/edit

ответ

7

Вопрос заключается в том, что ko.computed оценивается сразу после его создания, по умолчанию. Он переоценивается только при изменении одной из его зависимостей. В вашем сценарии нет зависимостей, которые обновляются, что приведет к переоценке greeting.

Один из вариантов заключается в использовании флага deferEvaluation, чтобы предотвратить вычисление от оценки до его первого доступа. Это будет выглядеть так:

self.greeting = ko.computed({ 
    read: function() { 
     return self.hello() + '!!'; 
    }, 
    deferEvaluation: true 
}); 

В противном случае, если greeting зависит от некоторых конкретных наблюдаемых и наблюдаемых обновляется, то получила бы повторную оценку, а также.

0

Это странно сценарий, так как зависимости ko.computed записываются только тогда, когда computed оценивается в первый раз. Когда greeting оценивается в первый раз, нокаут ссылается на self.hello. Когда вы меняете ссылку self.hello на другую вычисленную переменную, зависимости не обновляются.

Чтобы решить эту проблему, мы можем сделать self.hello сам по себе является observable:

self.hello = ko.observable(ko.computed(function() { 
    return 'Not implemented hello'; 
})); 

и self.greeting, ссылка self.hello так:

self.greeting = ko.computed(function() { 
    return self.hello()() + '!!'; 
}); 

Когда вам нужно обновить self.hello, вы можете сделать :

dog.hello(ko.computed(function() { 
    return 'Wooff'; 
})); 

Я также собрал модифицированный пример в JSBin для справки: http://jsbin.com/ogajaw/1/edit.

В конце концов, это странный пример. Но это работает.

+0

Да, извините за странный сценарий, я думаю, я упростил его на один шаг слишком далеко. – Cotten

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