从模型中取消绑定视图
unbinding a view from a model
这个 jsfiddle ( http://jsfiddle.net/mjmitche/avo5nnus/39/ ) 演示了我遇到的问题,但我会在这里解释。我有一个具有 startInterval
和 stopInterval
函数的主视图。在 startInterval 中,我调用了一个方法,该方法将值添加到我在 startInterval
函数中使用代码 this.model = new myModel()
创建的模型中的统计数据数组。如果我停止然后再次 startInterval
(此时代码再次运行 this.model = new myModel()
,它仍然是第一次按下 startInterval
按钮时的同一个数组。
例如,如果我按下开始,随机数 3 被添加到统计数组(在 addToModel
函数中),然后按下停止,然后再次按下开始,这将添加一个 5 到stats 数组,该数组实际上有一个 3 和一个 5。如果您按开始和停止,您可以在 jsfiddle 中看到值打印到屏幕上。
在我的实际应用程序中,我尝试过将统计数据数组设置为 []
,但我无法清除它。理想情况下,我希望从模型中取消引用视图。
startInterval: function(){
this.model = new myModel();
this.model.intervalId = setInterval(this.addToModel.bind(this), 1000);
},
stopInterval: function(){
clearInterval(this.model.intervalId);
var modelstats = this.model.get("stats");
},
addToModel: function(){
var arr = this.model.get("stats");
var num = Math.floor((Math.random() * 10) + 1);
var view = new StatView({model: this.model});
arr.push(num);
this.model.set({"stats" : arr });
}
有什么解决方案吗?
虽然我的代码没有显示它,但模型最终会被添加到集合中,然后保存到数据库中,所以如果唯一的解决方案涉及销毁模型,请考虑到这一点(即有没有办法销毁模型而不将其从集合中删除)
您的 "stats" 属性通过默认设置在原型上共享。
因为在 javascript 中数组和对象是可变的,所以它引用同一个数组并且不会创建新数组。
您可以做的是将默认值作为默认值 returns 的函数 - 这样它们每个实例都是唯一的
var myModel = Backbone.Model.extend({
defaults: function () {
return {
stats: [],
intervalId: ''
}
}
});
这个 jsfiddle ( http://jsfiddle.net/mjmitche/avo5nnus/39/ ) 演示了我遇到的问题,但我会在这里解释。我有一个具有 startInterval
和 stopInterval
函数的主视图。在 startInterval 中,我调用了一个方法,该方法将值添加到我在 startInterval
函数中使用代码 this.model = new myModel()
创建的模型中的统计数据数组。如果我停止然后再次 startInterval
(此时代码再次运行 this.model = new myModel()
,它仍然是第一次按下 startInterval
按钮时的同一个数组。
例如,如果我按下开始,随机数 3 被添加到统计数组(在 addToModel
函数中),然后按下停止,然后再次按下开始,这将添加一个 5 到stats 数组,该数组实际上有一个 3 和一个 5。如果您按开始和停止,您可以在 jsfiddle 中看到值打印到屏幕上。
在我的实际应用程序中,我尝试过将统计数据数组设置为 []
,但我无法清除它。理想情况下,我希望从模型中取消引用视图。
startInterval: function(){
this.model = new myModel();
this.model.intervalId = setInterval(this.addToModel.bind(this), 1000);
},
stopInterval: function(){
clearInterval(this.model.intervalId);
var modelstats = this.model.get("stats");
},
addToModel: function(){
var arr = this.model.get("stats");
var num = Math.floor((Math.random() * 10) + 1);
var view = new StatView({model: this.model});
arr.push(num);
this.model.set({"stats" : arr });
}
有什么解决方案吗?
虽然我的代码没有显示它,但模型最终会被添加到集合中,然后保存到数据库中,所以如果唯一的解决方案涉及销毁模型,请考虑到这一点(即有没有办法销毁模型而不将其从集合中删除)
您的 "stats" 属性通过默认设置在原型上共享。 因为在 javascript 中数组和对象是可变的,所以它引用同一个数组并且不会创建新数组。 您可以做的是将默认值作为默认值 returns 的函数 - 这样它们每个实例都是唯一的
var myModel = Backbone.Model.extend({
defaults: function () {
return {
stats: [],
intervalId: ''
}
}
});