考虑问题的最佳方法是根据Backbone TodoMVC应用程序来考虑它(即使这不是我正在做的事情,它的相似之处在于它有一个主视图和许多列表视图)。如果你在Todo模型上声明了一个自定义destroy
方法(比如我下面的那个)并点击一个视图来删除它,那么在触发的方法中(调用this.model.destroy),你无法在模型上调用自定义destroy方法,因为this.model
不是模型的实例。以某种方式调用this.model.destroy
clear: function () { //in the todo app, this method is called clear
this.model.destroy();
}
用于销毁模型,但如果您尝试调用自定义destroy方法则不行。
下面,我就我的应用程序解释相同的内容。
我有一个使用服务器端存储的Backbone应用程序,但无法向服务器发送删除请求。使用另一个SO答案,我在模型上创建了一个自定义destroy方法(FunkyModel
如下所示),我尝试在视图中的deleteModel方法中调用该自定义destroy方法,但无济于事。
然而,它并没有在FunkyModel上调用自定义destroy方法。当我检查this.model
时,它并没有说它是FunkyModel
的实例,而是只说Backbone.Model
然后列出模型的属性。所以很明显它不是FunkyModel的一个实例,因此它不能在FunkyModel上调用自定义destroy方法,但同时在attributes
属性下,它具有FunkyModel实例的所有属性,这并不奇怪。
问题:模型如何具有模型实例所独有的属性,但不是该模型的实例,而是简单的Backbone.Model
更多信息:
该应用程序的结构类似于BackboneMVC Todo App,因为它有一个主视图,然后它将更多视图作为列表项附加。当我单击其中一个视图上的删除符号时,它会触发一个调用deleteModel
方法的事件,我调用该方法
deleteModel(e){
this.model.destroy();
}
当然,根据我点击的列表视图,this.model的属性会有所不同,但在任何情况下都不是模型的实例。它只是一个Backbone.Model,它的属性具有特定实例的属性。我不确定不是实例的模型如何在其属性中具有来自特定实例的属性。
模型
export class FunkyModel extends Model{
defaults(){
return {
name: '',
type: ''
}
}
addToCollection(){
collection.add(this);
this.save();
}
destroy(options){
var opts = _.extend({url: '/api/'}, options || {});
console.log("never getting run");
return Backbone.Model.prototype.destroy.call(this, opts);
}
}
视图
deleteModel(e){
this.model.destroy({success: function(model, response, xhr){
console.log(model,xhr, options, "success callback") //xhr is undefined
},
error: function(model, xhr,options){
console.log(model,xhr,options, "error callback")
}
}
更多信息
创建模型时,我会
this.model = new FunkyModel();
this.model.set({"type": "funky"})
当模型被保存时,它会被添加到集合中(上面原始OP中显示的代码)。我想知道当我调用this.model.destroy()时,它只是在从集合中删除它时才会销毁它(因此触发了成功回调)。