2013-05-10 2 views

ответ

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 
+4

любопытно - какой смысл в опросе каждые 10 секунд, если это вопрос оценки дня? не было бы лучше определить длительность фронта, задержать запуск события вызовом setTimeout, а затем повторно запустить эту функцию с помощью другого setTimeout с 86400? –

+0

Это хорошая идея. Попробуйте добавить ответ. – kapa

+0

Спасибо, всем! Я надеялся избежать использования setTimeout в пользу более ориентированного на события подхода, но, учитывая, что мне просто нужно знать, когда меняется дата, я не хочу создавать целую модель только для одной простой функции. Я, вероятно, буду применять подход Нирваны. Еще раз спасибо, всем! – CullenJ

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, который обновит свойство «день» модели. В самом представлении мы слушаем изменение свойства «день». После обновления свойства мы повторно инициализируем метод, который изменяет дату. Таким образом, нет опроса, и ваши события будут срабатывать после изменения даты.

Конечно, есть множество способов, вы можете транслировать обновление - то есть явно вызвать событие в отличие от 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. –

Смежные вопросы