2012-02-27 7 views
13

Tengo un modelo de vista Knockout define así:Ajuste del valor de propiedad de definición fuera Knockout vista del modelo

function viewModel() { 
    var self = this; 

    self.myName = ko.observable(); 
    self.myValue = ko.observable("10"); 
}; 

Ahora tenía que cambiar un valor del modelo de vista cuando se hace clic en un enlace, así:

$('a.treeitem').live("click", function (e) { 
    e.preventDefault(); 
    viewModel.myValue("20"); // this line does not work 
}); 

sin embargo, no puedo encontrar la manera correcta de ajustar el valor, la consola de Chrome muestra el siguiente mensaje: no detectada TypeError: función del objeto ViewModel() {...} tiene ningún método 'myValue'

+0

No utilice 'vivo() 'más :) está obsoleto. Es mejor usar 'on()'. Consulte la página [live()] (http://api.jquery.com/live/) para obtener más información sobre la depreciación – soniiic

+0

¡Agradable! Cambié mi código de live() a on(). Gracias. –

Respuesta

22

Puede guardar el modelo de vista como una variable de la siguiente manera:

window.vm = new viewModel(); 
ko.applyBindings(vm); 

$('a.treeitem').live("click", function (e) { 
    e.preventDefault(); 
    window.vm.myValue("20"); 
}); 

Cada vez que se lee de window.vm se le lee en esa instancia real del objeto ViewModel

+0

Esto es exactamente lo que estaba buscando. ¡Gracias! –

+0

¡Gran respuesta, gracias! –

+0

Al intentar usar esto para escribir un valor booleano en la forma de 'vm = new vm (listOfObjects);' y 'vm.Expired (true);' (en otras palabras, para agregar un valor booleano), dice " La función esperada es el error. El texto sin formato puede escribirse como usted describe. – vapcguy

2

En realidad, lo que quiero hacer se puede hacer dentro de la definición de la vista del modelo, por lo que puede cambiar el código para esto:

function viewModel() { 
    var self = this; 

    self.myName = ko.observable(); 
    self.myValue = ko.observable("10"); 

    $('a.treeitem').live("click", function (e) { 
     e.preventDefault(); 
     self.myValue("20"); 
    }); 
}; 

Ahora todo funciona bien. A veces, el camino correcto realmente es el más fácil.

+2

¿No te refieres a 'self.myValue (" 20 ")'? – soniiic

+0

@soniiic Ups, línea incorrecta copiada. Editado –

+2

Esto parece un poco extraño. El modelo de vista está destinado a no tener ninguna dependencia en la interfaz de usuario. El código en la respuesta aceptada es más parecido a MVVM. –

Cuestiones relacionadas