2013-01-02 2 views
6

Czy zaleca się tworzenie właściwości obliczeniowych na obiekcie prototypowym?Korzystanie z prototypu dla właściwości KnockoutJS

To co ja próbował poniżej ale firstName wiązania powrocie funkcji jako ciąg zamiast wykonywania go (http://jsfiddle.net/W37Yh).

var HomeViewModel = function(config, $, undefined) { 

    if (!this instanceof HomeViewModel) { 
     return new HomeViewModel(config, $, undefined); 
    } 

    this.firstName = ko.observable(config.firstName); 
    this.lastName = ko.observable(config.lastName); 
}; 

HomeViewModel.prototype.fullName = function() { 
    return ko.computed(function() { 
     return this.firstName() + " " + this.lastName(); 
    }, this); 
}; 

var model = new HomeViewModel({ 
    firstName: "John", 
    lastName: "Smith" 
}, jQuery); 

ko.applyBindings(model);​ 
+0

Nie, tworzenie obiektów opartych na prototypach i nokaut zwykle nie pasują do siebie. – Niko

+0

Po drugie, co powiedział mi niko, problem z prototypem polega na tym, że wszystkie instancje twoich obiektów będą próbowały dzielić te same obliczenia na prototypie. Bardzo źle. Bezpośrednią rzeczą, którą widzisz, jest pełna nazwa, to tylko funkcja zwracająca obliczony, a nie wyliczony, a więc ciąg. –

Odpowiedz

15

this nie jest rzeczywista ViewModel ponieważ instancja nie został jeszcze utworzony. Można wykonać:

+3

Dzięki. To samo zasugerował Ryan Niemeyer w [tym wideo] (http://vimeo.com/51103092) –

+0

Dzięki. To podejście działa również w przypadku subskrybowania. Odkryłem, że ViewModel.prototype.getFullName = function() {} jest poprawne, tak samo jak twoje podejście. – Aligned

+0

Tak, moja deklaracja prototypowa to po prostu zgrabny sposób grupowania wszystkich funkcji prototypowych pod jednym literałem obiektu – Anders