2013-01-02 8 views
6

Wird empfohlen, berechnete Eigenschaften für das Prototypobjekt zu erstellen?Verwenden des Prototyps für KnockoutJS berechnete Eigenschaften

Dies ist, was ich unten versucht habe, aber die firstName Bindung gibt die Funktion als Zeichenfolge zurück, anstatt sie auszuführen (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

Nein, prototypbasierte Objekterstellung und Knockout gehen normalerweise nicht gut zusammen. – Niko

+0

Ich zweite Sekunde, was Niko sagte, das Problem mit dem Prototyp ist alle Instanzen Ihrer Objekte werden versuchen, die gleichen auf dem Prototyp berechnet zu teilen. Sehr schlecht. Die unmittelbare Sache, die Sie sehen, ist der vollständige Name ist nur eine Funktion, die eine berechnete, nicht eine berechnete, also die Zeichenfolge zurückgibt. –

Antwort

15

this ist nicht das tatsächliche Viewmodel, da die Instanz noch nicht erstellt. Sie können

ViewModel = function() { 
    this.fullName = ko.computed(this.getFullName, this); 
}; 

ViewModel.prototype = { 
    getFullName: function() { 
     return this.firstName() + " " + this.lastName(); 
    } 
}; 
+3

Danke. Dies wurde auch von Ryan Niemeyer in [diesem Video] vorgeschlagen (http://vimeo.com/51103092) –

+0

Danke. Dieser Ansatz funktioniert auch für den Abonnenten. Ich habe festgestellt, dass ViewModel.prototype.getFullName = function() {} ebenso wie Ihre Vorgehensweise gültig ist. – Aligned

+0

Ja, meine Prototyp-Deklaration ist nur eine einfache Möglichkeit, alle Ihre Prototyp-Funktionen unter einem Objektliteral zu gruppieren – Anders

Verwandte Themen