2012-05-14 12 views
14

He estado intentando durante días hacer que esto funcione y no puedo entender por qué cuando tengo mi vista para destruir un modelo que pertenece a una colección (que correctamente tiene un atributo url para la búsqueda inicial de los datos de los modelos), solo dispara el 'evento' de destrucción que se borra hasta la colección para que mi vista de lista lo enlace fácilmente. Pero nunca envía una solicitud DELETE real ni ninguna solicitud al servidor. En todas partes donde miro, veo a todos usando el urltrtr de la colección o urlRoot si el modelo no está conectado a una colección. Incluso probé antes del presente this.model.destroy() para verificar el modelo < console.log (this.model.url());Backbone.js model.destroy() no está enviando la solicitud DELETE

No he sobrescrito los métodos de destrucción ni sincronización para la red troncal. Además, cada modelo tiene un atributo id que se rellena a través de la recuperación de la colección (de los registros de la base de datos).

La destrucción tiene lugar en la vista de elemento de lista, y el evento "destruir" de la colección está vinculado en la vista de lista. Todo eso funciona bien (el manejo del evento), pero el problema, una vez más, es que no hay una solicitud al servidor.

Esperaba que backbone.js lo hiciera automáticamente. Eso es lo que implica la documentación, así como los numerosos ejemplos en todas partes.

Muchas gracias a cualquiera que pueda dar una entrada útil.

FYI: Estoy desarrollando en wampserver PHP 5.3.4.

ListItemView = BaseView.extend({ 

    tagName: "li", 

    className: "shipment", 

    initialize: function (options) { 
     _.bindAll(this); 
     this.template = listItemTemplate; 
     this.templateEmpty = listItemTemplateEmpty; 
    }, 

    events: { 
     'click .itemTag' : 'toggleData', 
     'click select option' : 'chkShipper', 
     'click .update' : 'update', 
     'click button.delete' : 'removeItem' 
    }, 

    // .... 

    removeItem: function() { 
     debug.log('remove model'); 

     var id = this.model.id; 

     debug.log(this.model.url()); 

     var options = { 
      success: function(model, response) { 
       debug.log('remove success'); 
       //debug.log(model); 
       debug.log(response); 
       // this.unbind(); 
       // this.remove(); 
      }, 
      error: function(model, response) { 
       debug.log('remove error'); 
       debug.log(response); 
      } 
     }; 

     this.model.destroy(options); 


     //model.trigger('destroy', this.model, this.model.collection, options); 


    } 

}); 


Collection = Backbone.Collection.extend({ 

    model: Model, 

    url: '?dispatch=get&src=shipments', 
    url_put : '?dispatch=set&src=shipments', 

    name: 'Shipments', 

    initialize: function() { 
     _.bindAll(this); 
     this.deferred = new $.Deferred(); 
     /* 
     this.fetch({ 
      success: this.fetchSuccess, 
      error: this.fetchError 
     }); 
     */ 
    }, 

    fetchSuccess: function (collection, response) { 
     collection.deferred.resolve(); 
     debug.log(response); 
    }, 

    fetchError: function (collection, response) { 
     collection.deferred.reject(); 
     debug.log(response); 
     throw new Error(this.name + " fetch failed"); 
    }, 

    save: function() { 
     var that = this; 
     var proxy = _.extend(new Backbone.Model(), 
     { 
      url: this.url_put, 
      toJSON: function() { 
       return that.toJSON(); 
      } 
     }); 
     var newJSON = proxy.toJSON() 
     proxy.save(
      newJSON, 
      { 
       success: that.saveSuccess, 
       error: that.saveError 
      } 
     ); 
    }, 

    saveSuccess: function(model, response) { 
     debug.log('Save successful'); 
    }, 

    saveError: function(model, response) { 
     var responseText = response.responseText; 
     throw new Error(this.name + " save failed"); 
    }, 

    updateModels: function(newData) { 
     //this.reset(newData); 
    } 

}); 



ListView = BaseView.extend({ 

    tagName: "ul", 

    className: "shipments adminList", 

    _viewPointers: {}, 

    initialize: function() { 
     _.bindAll(this); 
     var that = this; 
     this.collection; 
     this.collection = new collections.ShipmentModel(); 
     this.collection.bind("add", this.addOne); 

     this.collection.fetch({ 
      success: this.collection.fetchSuccess, 
      error: this.collection.fetchError 
     }); 


     this.collection.bind("change", this.save); 
     this.collection.bind("add", this.addOne); 
     //this.collection.bind("remove", this.removeModel); 
     this.collection.bind("destroy", this.removeModel); 
     this.collection.bind("reset", this.render); 
     this.collection.deferred.done(function() { 
      //that.render(); 
      that.options.container.removeClass('hide'); 
     });    

     debug.log('view pointers'); 

     // debug.log(this._viewPointers['c31']); 
     // debug.log(this._viewPointers[0]); 

    }, 

    events: { 

    }, 

    save: function() { 
     debug.log('shipments changed'); 
     //this.collection.save(); 
     var that = this; 
     var proxy = _.extend(new Backbone.Model(), 
     { 
      url: that.collection.url_put, 
      toJSON: function() { 
       return that.collection.toJSON(); 
      } 
     }); 
     var newJSON = proxy.toJSON() 
     proxy.save(
      newJSON, 
      { 
       success: that.saveSuccess, 
       error: that.saveError 
      } 
     ); 
    }, 

    saveSuccess: function(model, response) { 
     debug.log('Save successful'); 
    }, 

    saveError: function(model, response) { 
     var responseText = response.responseText; 
     throw new Error(this.name + " save failed"); 
    }, 

    addOne: function(model) { 
     debug.log('added one'); 
     this.renderItem(model); 
     /* 
     var view = new SB.Views.TicketSummary({ 
      model: model 
     }); 
     this._viewPointers[model.cid] = view; 
     */ 
    }, 

    removeModel: function(model, response) { 
     // debug.log(model); 
     // debug.log('shipment removed from collection'); 

     // remove from server 
     debug.info('Removing view for ' + model.cid); 
     debug.info(this._viewPointers[model.cid]); 
     // this._viewPointers[model.cid].unbind(); 
     // this._viewPointers[model.cid].remove(); 
     debug.info('item removed'); 
     //this.render(); 
    }, 

    add: function() { 
     var nullModel = new this.collection.model({ 
      "poNum" : null, 
      "shipper" : null, 
      "proNum" : null, 
      "link" : null 
     }); 
     // var tmpl = emptyItemTmpl; 
     // debug.log(tmpl); 
     // this.$el.prepend(tmpl); 
     this.collection.unshift(nullModel); 
     this.renderInputItem(nullModel);     
    }, 

    render: function() { 
     this.$el.html(''); 
     debug.log('list view render'); 
     var i, len = this.collection.length; 
     for (i=0; i < len; i++) { 
      this.renderItem(this.collection.models[i]); 
     }; 
     $(this.container).find(this.className).remove(); 

     this.$el.prependTo(this.options.container); 

     return this; 
    },   

    renderItem: function (model) { 
     var item = new listItemView({ 
      "model": model 
     }); 

     // item.bind('removeItem', this.removeModel); 

     // this._viewPointers[model.cid] = item; 
     this._viewPointers[model.cid] = item; 
     debug.log(this._viewPointers[model.cid]); 
     item.render().$el.appendTo(this.$el); 
    }, 

    renderInputItem: function(model) { 
     var item = new listItemView({ 
      "model": model 
     }); 
     item.renderEmpty().$el.prependTo(this.$el); 
    } 

}); 

P.S ... Nuevamente, hay un código al que se hace referencia desde otro lugar. Pero tenga en cuenta: la colección tiene un conjunto de atributos de url. Y funciona para la búsqueda inicial, así como también cuando hay un evento de cambio disparado para guardar los cambios realizados en los modelos. Pero el evento de destrucción en la vista del elemento de la lista, si bien desencadena el evento "destruir" con éxito, no envía la solicitud HTTP 'ELIMINAR'.

+1

qué versión de backbone, publicar un código siempre ayuda, un jsFiddle siempre es impresionante –

+0

Sí, por favor, comparta con nosotros un ejemplo de código muy simple que reproduce el problema. – fguillen

+1

¿Está seguro de que ha incluido la url base para su API en la extensión de su modelo? – kinakuta

Respuesta

39

¿Tienen sus modelos ID? Si no, la solicitud HTTP no será enviada. - nikoshr 14 de mayo a 18:03

¡Muchísimas gracias! El pequeño comentario de Nikoshr fue exactamente lo que necesitaba. Pasé las últimas 5 horas jugando con esto. Solo tuve que agregar una identificación a los valores predeterminados en mi modelo.

+2

Tenga cuidado, agregar un atributo id a los valores predeterminados romperá Backbone.Model.isNew() y posteriormente .save() 's POST y PUT. – GijsjanB

+1

¿Por qué esto no se acepta?:/(Y) – Tamil

+0

Creo que la onza. es un novato en Stackoverflow y no sabe cómo hacerlo. –

Cuestiones relacionadas