Cargando datos con dependienteObservable causando un bucle infinito

Estoy jugando con Knockout y ahora intento usar el complemento de dirección Knockout (basado en la dirección jQuery).

Este código a continuación funciona, excepto que cuando intento ingresar la dirección, el linkObservableToUrl proporciona que la página se carga sin el derecho tags. Supongo que algo anda mal en la forma en que estoy cargando los mensajes, pero no estoy seguro de cómo se debe hacer esto usando el marco Knockout.

Tengo el siguiente código, que está causando un bucle infinito:

var viewModel = {
    page: ko.observable(1),
    //messages: ko.observableArray([]),
    tags: ko.observable()
};

viewModel.filterTags = function (filterTags) {
    viewModel.tags(filterTags);
};

viewModel.messages = ko.dependentObservable(function () {
    $.ajax(
        // abbreviated
        data: ko.toJSON(viewModel),
        // abbreviated
)}, viewModel);

ko.applyBindings(viewModel);

ko.linkObservableToUrl(viewModel.tags, "tags", null);

¿Cómo puedo resolver esto y aún así los mensajes dependen de la página y las etiquetas?

preguntado el 27 de agosto de 11 a las 18:08

2 Respuestas

Cambie a AngularJS. El enlace de datos de Angular es mucho mejor que el de Knockout. Muchos de los problemas que está encontrando aquí con bucles infinitos, etc. se deben a la necesidad de Knockout de envoltorios observables.

Angular no requiere envoltorios observables de sus objetos. Angular puede observar cualquier objeto JSON / Javascript estándar y enlazar datos directamente a cualquier elemento HTML a través de MVVM.

En Angular, simplemente haría su llamada AJAX para ViewModel.messages, y el JSON estándar se aplicaría a su propiedad ViewModel.messages. Sin envoltorios observables. Esto elimina la necesidad de ko.dependentObservable () y, por lo tanto, elimina su bucle infinito.

http://www.angularjs.org

Respondido 29 ago 11, 18:08

Gracias, lo echaré un vistazo. - CD..

En el segundo ejemplo (que se cierra por mucho tiempo para un fragmento de código) tiene esto:

viewModel.messages = ko.dependentObservable(function () {
...
        data: ko.toJSON(viewModel),
...

Si la llamada a ko.toJSON intenta obtener el valor de todas las propiedades observables en el modelo de vista, intentará evaluar la propiedad viewModel.messages. Que llamará ko.toJSON de nuevo, lo que lleva a un bucle infinito.

Respondido 29 ago 11, 02:08

10x, ¿es una forma sencilla de obtener un JSON de todas las propiedades observables excepto la propiedad de los mensajes? - CD..

No conozco una forma sencilla de hacer eso. Puede dividir el modelo de vista en una sección que se envía al servidor y una sección que no lo hace, pero mi preferencia sería extraer explícitamente las propiedades que desea del modelo de vista cuando realiza la solicitud ajax. Parece probable que en el futuro agregue más cosas al modelo de vista que no necesitaría enviar al servidor. (es decir, siga el patrón del objeto de transferencia de datos (DTO), en lugar de intentar enviar el modelo de vista completo) - Douglas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.