2012-05-07 8 views
6

En mi modelo de vista, tengo un ObserableArray knockoutjs. Justo después de inicializar ViewModel, vincula los datos con éxito. Entonces, lo que tengo que hacer es ordenar la colección.knockoutjs ObservableArrays y función de ordenación: UI no se actualiza

$.each(vm.searchResults(), function (i, property) { 
    console.log(property.Name()); 
}); 

vm.searchResults().sort(function (a, b) { 
    return a.Name().toLowerCase() > b.Name().toLowerCase() ? 1 : -1; 
}); 

$.each(vm.searchResults(), function (i, property) { 
    console.log(property.Name()); 
}); 

Como se puede ver, la salida I Nombre del elemento a la consola para ver el antes y después de la clasificación. La clasificación funciona bien. El problema es con la actualización de UI. De alguna manera, la interfaz de usuario no se actualiza.

A continuación, tratar de eliminar un registro de la matriz con el código siguiente para ver si la interfaz de usuario responderá a eso o no:

vm.searchResults().shift(); 

La interfaz de usuario sigue siendo el mismo y no actualizó de nuevo. ¿Cuál sería el problema aquí?

Editar:

Este es un caso de ejemplo, así: http://jsfiddle.net/tugberk/KLpwP/

El mismo problema aquí también.

Editar:

He resuelto el problema como se muestra en este ejemplo: http://jsfiddle.net/tugberk/KLpwP/16/ Pero todavía no estoy seguro de por qué funcionó mientras trataba en un principio.

Respuesta

18

Vas a desenvolver la matriz observable cuando vayas a ordenarla. Esto causa un problema, porque KO no puede rastrear la matriz fue cambiado. ko.observableArray() tiene la función sort con la misma firma y notificará a los suscriptores de observable que se ha cambiado. La solución es muy simple: eliminar llaves vm.searchResults().sort =>vm.searchResults.sort. Verifique mi ejemplo: http://jsfiddle.net/RbX86/

Otra forma de decirle a KO que la matriz tiene cambios - llame al método valueHasMutated después de las manipulaciones con la matriz. Revise esta muestra: http://jsfiddle.net/RbX86/1/ Este enfoque es muy bueno cuando necesita hacer muchos cambios en su matriz y desea actualizar la interfaz de usuario solo una vez.

Cuestiones relacionadas