Pregunta

Estoy escribiendo una aplicación web fácil usando knockout.js, pero tengo muchos problemas para lograr algo que debería ser fácil, pero no puedo entender dónde me equivoco. Tengo un ko.observableArray y los lleno con datos JSON de un servidor PHP REST. Cuando agrego o elimino los elementos de esta matriz, la UI se actualiza bien. Quiero que la interfaz de usuario se actualice cuando edito un elemento de matriz también. Leí que el elemento de la matriz no es observable, por lo que intenté hacerlos observables, pero aún así no funciona. Aquí está el código. (Omisé piezas que no considero importantes)

function sectionViewModel(){

    var self = this;
    self.sections = ko.observableArray();
            self.sectionToEdit = ko.observable();

        //code to initialize self.sections
    $.getJSON("sections", function(data){
         for(var i = 0; i < data.length ; i++){
             var id = ko.observable(data[i].id);
              var nome = ko.observable(data[i].nome);
             self.sections.push({id:id, nome:nome});
          }
     });



    self.confirmEdit = function(){
        $.ajax({
            url: 'sections/' + self.sectionToEdit().id,
            type: 'PUT',
            data: self.sectionToEdit().nome,
        });
    }

};

var debug = new sectionViewModel();
ko.applyBindings(debug);

Este código funciona si no hago el Inside $ .getjson, pero con él, obtengo el siguiente error: Object [Object Global] no tiene ningún método 'DisposeCallback' de Knockout.js en el momento en que activo la función Confirmedit. La solicitud PUT Tampoco se ejecuta y no tengo idea de por qué. Cualquier ayuda es realmente apreciada, ¡gracias!

¿Fue útil?

Solución

Porque nome es un observable, debes desenvolverlo en tu función:

self.confirmEdit = function(){
    $.ajax({
        url: 'sections/' + self.sectionToEdit().id,
        type: 'PUT',
        data: self.sectionToEdit().nome(),
    });
}

De lo contrario, JQuery trata al observable como un mapa de objetos, incluida la llamada a todas las funciones del objeto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top