Есть ли простой способ запуска события Backbone.js, когда изменяется текущая дата (только день, а не время)?Запуск события Backbone.js при изменении текущей даты
ответ
не имеют лучшее представление о том, чем регулярно проверять:
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
Вы можете создать конструктор, который проходит магистральная события, как это:
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()
Таким образом, ответ на вопрос - нет простого способа без прокатки собственного решения.
Тем не менее, реализация не так уж плоха.
Идея заключается в том, что у вас есть модель со свойством «день». После инициализации модели мы будем вызывать инициализатор, который будет определять продолжительность до полуночи завтра. Сразу после полудня будет вызван setTimeout, который обновит свойство «день» модели. В самом представлении мы слушаем изменение свойства «день». После обновления свойства мы повторно инициализируем метод, который изменяет дату. Таким образом, нет опроса, и ваши события будут срабатывать после изменения даты.
Конечно, есть множество способов, вы можете транслировать обновление - то есть явно вызвать событие в отличие от 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/
Использование 'setTimeout' определенно лучше, чем' setInterval' в моем ответе. Получите мой +1. –
- 1. События IE11 при изменении
- 2. Запуск события в пакете свойств Python при изменении элемента Array
- 3. Запуск события при изменении масштабирования SAP UI 5
- 4. Запуск события при изменении значения на входе с использованием JAVASCRIPT
- 5. Запуск события/метода при изменении UIWindow RootViewController SWIFT
- 6. Запуск пользовательских событий в backbone.js
- 7. Запуск макроса при изменении ячейки
- 8. Запуск тестов PHPUnit при изменении
- 9. Запуск PHP при изменении переменной
- 10. Запуск перезагрузки при изменении вращения
- 11. Backbone.js события касания
- 12. конкретные события при изменении размера()
- 13. jQuery: события при изменении ввода
- 14. События инициируется при изменении ячейки
- 15. Запуск события на определенные даты Android
- 16. Запретить мигание текущей активности при изменении фрагментов?
- 17. Номер приращения при изменении даты
- 18. автоматически меняет поля модели при изменении вида в backbone.js
- 19. Backbone.js: Невозможно привязать события
- 20. Backbone.js События привязки
- 21. Триггер события backbone.js
- 22. События Backbone.js не работают
- 23. Backbone.js События не срабатывают
- 24. Backbone.js захватывает события RegEx?
- 25. События backbone.js на шаблонах
- 26. Глобальные события Backbone.js
- 27. wxPython, запуск события при перетаскивании
- 28. Запуск события при создании элемента
- 29. запуск связанного события при загрузке
- 30. Вызывает активность при изменении ориентации без перезапуска текущей активности
любопытно - какой смысл в опросе каждые 10 секунд, если это вопрос оценки дня? не было бы лучше определить длительность фронта, задержать запуск события вызовом setTimeout, а затем повторно запустить эту функцию с помощью другого setTimeout с 86400? –
Это хорошая идея. Попробуйте добавить ответ. – kapa
Спасибо, всем! Я надеялся избежать использования setTimeout в пользу более ориентированного на события подхода, но, учитывая, что мне просто нужно знать, когда меняется дата, я не хочу создавать целую модель только для одной простой функции. Я, вероятно, буду применять подход Нирваны. Еще раз спасибо, всем! – CullenJ