2012-09-28 13 views
5

Estoy usando Knockout.js para una aplicación de cliente enriquecido y consistirá en una gran cantidad de modelos de vista knockout.js. En el desarrollo, noté dos formas de crear Knockout.js ViewModels. Primera manera.View-Model declarando de Knockout.js. Hay dos métodos

function AppViewModel() { 
this.firstName = ko.observable("Bert"); 
this.lastName = ko.observable("Bertington");} 

Segunda manera.

var appViewModel = { 
this.firstName = ko.observable("Bert"), 
this.lastName = ko.observable("Bertington")}; 

¿Hay alguna diferencia específica en estos dos métodos para declarar ViewModels? En knockout.js official page examples han usado de la primera manera. Pero en marcos de terceros como Knockout-validations.js ha usado la segunda vía. ¿Qué camino debo usar? ¿Alguna ventaja específica en usarlo?

Descubrí que si uso la primera vía, entonces no puedo usar el framework Knockout-validations.js. Estoy realmente confundido sobre este asunto. Cualquier comentario es apreciado.

Gracias.

+0

Aquí hay otro enlace que podría ayudar: http://stackoverflow.com/questions/9589419/difference-between-knockout-view-models-declared-as-object-literals-vs-functions –

Respuesta

3

La primera forma define un constructor de objetos pero no instancia un nuevo objeto, puede pasar los argumentos de esta manera. Si está creando múltiples objetos/modelos, esto definitivamente sería menos torpe que la segunda manera.

La segunda forma es utilizar la sintaxis del inicializador de objetos, esto ejemplifica un nuevo objeto en la memoria con los campos en los que lo configuró. En general, esto produce un tamaño de código más pequeño; si está creando dos objetos de estructuras iguales o similares, use la primera manera.

No hay ninguna razón por la que no pueda usar la primera en lugar de la segunda. Simplemente creando un nuevo objeto y páselo donde sea que se necesite.

Este:

function AppViewModel(fName, lName) { 
    var self = this; 
    self.firstName = ko.observable(fName); 
    self.lastName = ko.observable(lName); 
} 
... 
var appViewModel = new AppViewModel("Bert", "Bertington"); 

crea el mismo objeto como este:

var appViewModel = { 
    this.firstName = ko.observable("Bert"), 
    this.lastName = ko.observable("Bertington") 
}; 

El primero uno solo permite más AppViewModel s a ser creado, por ejemplo, new AppViewModel("Joe", "Shmoe")

2

La diferencia que describes no es específica de las bibliotecas knockout o knockout, sino que es un tema de nivel de idioma ampliamente debatido entre la comunidad de JavaScript. Douglas Crockford, un gurú de JavaScript, tiene dos artículos sobre ambos lados de la cuestión:

De postes repartidos foro, artículos de blog, y conversaciones con los programadores de JavaScript, parece que la comunidad tiende a abrazar el estilo prototípico. Debe usar el estilo que prefiera. De acuerdo con la documentación, parece que la biblioteca de validación Knockout-Validation se diseñó teniendo en cuenta el estilo clásico. La ventaja del estilo clásico en este caso sería simplemente que es más fácil de usar con la biblioteca Knockout-Validation. La desventaja de la forma prototípica es que es más difícil de usar con esta biblioteca.

Cuestiones relacionadas