我正在Backbone.js中编写一个简单的应用程序,并遇到了令人沮丧的情况,即在更改每个模型属性之前,我的函数绑定到更改事件。
总之,我的组件绑定到一个日期选择器,并接受一个开始日期和结束日期。我想等到设置开始日期和结束日期,但是在设置两者之前使用更改事件触发。
这是一些伪代码:
define(["jquery", "underscore"], function () {
var model = Backbone.Model.extend({
initialize: function (options) {
this._super();
//Make the items null
this.set("startDate", null);
this.set("endDate", null);
//Listen for changes to data
this.on("change:startDate change:endDate", this.prepareData, this);
},
prepareData: function() {
var startDate= this.get("startDate");
if (!startDate)
return;
var endDate= this.get("endDate");
if (!endDate)
return;
//DO MY STUFF
}
});
这样做的结果是第一次触发'prepareData'函数时,我有新的开始日期和旧的结束日期。
任何线索?
编辑:
增加的复杂性是有时只会更改日期日期,例如用户选择与之前相同的结束日期的范围。好像我需要在触发功能之前等待一段时间来检查是否有变化。
答案 0 :(得分:1)
您可以在模型中存储旧日期(this._startDate& this._endDate)以检查它们是否已更改:
prepareData: function() {
var count = 0;
var startDate= this.get("startDate");
if (startDate == this._startDate)
count++;
var endDate= this.get("endDate");
if (endDate == this._endDate)
count++;
if (count == 0) {
return;
} else if (count == 1) {
// here set your timeout
}
this._startDate = startDate;
this._endDate = endDate;
//DO MY STUFF
}
答案 1 :(得分:0)
您注册“change:startDate change:endDate”这一事实并不意味着只有在两者都发生变化时才会触发事件。它们是separeted事件,因此当“change:startDate”发生时,您的prepareData函数被调用,并且当“change:endDate”发生时也是如此。 这就是为什么第一次调用prepareData函数时,endData具有旧值。