2013-01-02 7 views
6

Si consiglia di creare proprietà calcolate sull'oggetto prototipo?Utilizzo del prototipo per proprietà calcolate KnockoutJS

Questo è quello che ho tentato di seguito ma il binding firstName sta restituendo la funzione come una stringa anziché eseguirla (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

No, la creazione di oggetti basata su prototipi e l'eliminazione diretta di solito non vanno bene insieme. – Niko

+0

I secondo quello che ha detto niko, il problema con il prototipo è che tutte le istanze dei tuoi oggetti cercheranno di condividere lo stesso calcolato sul prototipo. Molto brutto. La cosa immediata che stai vedendo è che il nome completo è solo una funzione che restituisce un calcolo, non un calcolo, quindi la stringa. –

risposta

15

this non è il ViewModel reale in quanto l'istanza non è ancora creata. Puoi fare

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

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

Grazie. Questo è anche ciò che è stato suggerito da Ryan Niemeyer in [questo video] (http://vimeo.com/51103092) –

+0

Grazie. Questo approccio funziona anche per l'abbonamento. Ho trovato che ViewModel.prototype.getFullName = function() {} è valido così come il tuo approccio. – Aligned

+0

Sì, la mia dichiarazione di prototipo è un modo semplice per raggruppare tutte le funzioni del prototipo sotto un oggetto letterale – Anders

Problemi correlati