当前日期(只是一天,而不是时间)发生变化时,是否有简单的方法来触发Backbone.js事件?当前日期发生变化时触发Backbone.js事件
2
A
回答
2
我根本就没有定期检查一个更好的主意:
var lastCheckedDate = new Date();
setInterval(function() {
var d = new Date();
//TODO: check whether the day in d and lastCheckedDate are the same or not
//TODO: if not, trigger event
lastCheckedDate = d;
}, 10000); //this will check in every 10 seconds
2
您可以创建一个扩展骨干事件这样的构造:
var Clocks = function(){};
_.extend(Clocks.prototype, Backbone.Events, {
start: function() {
this.timer = setInterval(_.bind(this.tick, this), 1000);
return this;
},
tick: function() {
this.trigger('tick', new Date)
},
stop: function() {
this.timer && clearInterval(this.timer);
return this;
}
});
,然后用它在骨干模型更新它属性:
var ClocksModel = Backbone.Model.extend({
defaults: function() {
var date = new Date
return {
date: date.getDate(),
seconds: date.getSeconds()
}
},
initialize: function() {
this.clocks = new Clocks;
this.clocks.on('tick', this.updateDate, this)
},
updateDate: function (date) {
this.set('date', date.getDate())
this.set('seconds', date.getSeconds())
},
start: function() {
this.clocks.start();
return this;
},
stop: function() {
this.clock.stop();
return this;
}
});
然后你就可以:
clocks = new ClocksModel;
clocks
.on('change:seconds', function(model, newSeconds) {
console.log('seconds changed to ', newSeconds)
})
.on('change:date', function(model, newDate) {
console.log('date changed to', newDate)
})
.start()
4
所以,这个问题的答案 - 有没有滚动自己的解决方案没有简单方式。
这就是说,实现并不算太坏。
这里的想法是,你有一个'天'属性的模型。在初始化模型时,我们将调用一个初始化器来确定持续到“明天午夜”的持续时间。在午夜之后,setTimeout将被调用,它将更新模型的'day'属性。在视图本身中,我们倾听“天”属性的更改。一旦该属性更新,我们将重新初始化更改日期的方法。这样就没有轮询,并且一旦日期发生变化,你的事件就会被触发。
当然,有许多方法,你可以广播的更新 - 即明确触发,而不是set
荷兰国际集团的财产的事件 - 但这里是为了什么,我上述的代码:
模式
var Model = Backbone.Model.extend({
defaults: function(){
var d = new Date();
return {
day: d.getDay()
}
},
initialize: function(){
_.bindAll(this, '_init_date_trigger');
this._init_date_trigger();
},
_init_date_trigger: function(){
var now = new Date();
var midnightTomorrow = new Date();
midnightTomorrow.setDate(now.getDate() + 1);
midnightTomorrow.setHours(0,0,0,0);
var msTillTomorrow = midnightTomorrow - now + 1;
var me = this;
console.log("date will be changed in " + msTillTomorrow);
setTimeout(function(){
me.set("day", new Date().getDay());
me._init_date_trigger();
}, msTillTomorrow);
}
})
查看
var View = Backbone.View.extend({
template:_.template("The day is: <span class='day'> <%= day %> </span>"),
initialize: function(){
this.model.on("change:day", this.render);
},
render: function(){
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
实施
var myModel = new Model();
var myView = new View({model: myModel});
$("#example").html(myView.render().el);
这里的小提琴:http://jsfiddle.net/6KGzt/4/
+0
在我的答案中,使用'setTimeout'肯定比'setInterval'好。获取我的+1。 – 2013-05-10 16:11:28
相关问题
- 1. 当关系发生变化时触发休眠(事前/事后)更新事件
- 2. 当ListBox.Item的大小发生变化时触发事件
- 3. 当底层发生变化时,OpenLayers 2触发事件
- 4. 当页面主题发生变化时触发什么事件
- 5. 当ListView的ItemsSource发生变化时触发事件
- 6. 当css值发生变化时触发事件
- 7. 当UITabBarController的'selectedViewController'发生变化时触发一个事件?
- 8. 任何变量发生变化时触发一个事件
- 9. 当字符串变量发生变化时事件未被触发
- 10. 当值不变时触发backbone.js更改
- 11. 触发器触发基于与当前日期的时间差
- 12. 当事件源发生变化时,viewRender不会更新日历
- 13. Backbone.js事件触发器
- 14. AS3 ENTER_FRAME事件仍然在帧发生变化时触发
- 15. <input type =“number”/>什么事件发生变化时触发?
- 16. 表单发生变化时触发的事件
- 17. 如何在表格数据发生变化时触发前端的NOTIFICATION事件
- 18. 日期在解析时发生变化
- 19. 当表格内容发生变化时,在SWT中触发了哪个事件
- 20. 当元素的````属性发生变化时,是否会触发事件?
- 21. Java - 当对象的任何属性发生变化时触发事件
- 22. javascript事件发生之前触发
- 23. Archer GRC:当值列表发生变化时计算当前日期
- 24. 当使用datetime-picker选择日期/时间时触发事件
- 25. 当某些字段发生变化时,sql server db会触发
- 26. 当json数据发生变化时触发ng显示
- 27. 当yaml发生变化时,Bitbucket流水线未被触发
- 28. 当qtreewidgetitems复选框状态发生变化时触发信号
- 29. 当对象内容发生变化时触发脚本
- 30. 当Outook的连接状态发生变化时触发的EventHandler
好奇 - 什么是在投票点,如果每10秒它的评估当天的事?最好先确定持续时间,用setTimeout调用延迟事件触发,然后用另一个setTimeout与86400重新初始化该函数? – 2013-05-10 03:17:39
这是个好主意。考虑添加一个答案。 – kapa 2013-05-10 07:11:20
谢谢大家!我希望避免使用setTimeout来支持更多的事件驱动方法,但考虑到我真的只需要知道日期何时发生变化,我不想只为一个简单的功能创建整个模型。我可能会实施涅ana的方法。再次感谢大家! – CullenJ 2013-05-10 16:09:52