Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当前日期更改时触发Backbone.js事件_Javascript_Date_Backbone.js_Backbone Events - Fatal编程技术网

Javascript 当前日期更改时触发Backbone.js事件

Javascript 当前日期更改时触发Backbone.js事件,javascript,date,backbone.js,backbone-events,Javascript,Date,Backbone.js,Backbone Events,有没有一种简单的方法可以在当前日期(只是日期,而不是时间)发生变化时触发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, tr

有没有一种简单的方法可以在当前日期(只是日期,而不是时间)发生变化时触发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()

因此,问题的答案是——没有简单的方法可以不推出自己的解决方案

也就是说,实现还不错

这里的想法是,您有一个具有“day”属性的模型。初始化模型后,我们将调用一个初始值设定项,该初始值设定项将确定“明天午夜”之前的持续时间。午夜之后,将调用setTimeout,它将更新模型的“day”属性。在视图本身中,我们侦听“day”属性的更改。更新属性后,我们将重新初始化更改日期的方法。这样就没有轮询,一旦日期更改,您的事件就会被触发

当然,您可以通过多种方式广播更新—即显式触发事件,而不是
set
ing属性—但下面是我上面描述的代码:

型号

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;
    }
});

问题是:

好奇——如果只是评估一天,那么每10秒进行一次民意调查又有什么意义呢?提前确定持续时间,用setTimeout调用延迟事件触发,然后用另一个setTimeout调用86400重新初始化该函数不是更好吗?谢谢大家!我希望避免使用setTimeout,而采用更事件驱动的方法,但考虑到我真的只需要知道日期何时更改,我不想只为一个简单的功能创建一个完整的模型。我可能会实现涅盘的方法。再次感谢大家!在我的回答中,使用
setTimeout
肯定比使用
setInterval
要好。获取我的+1。
var myModel = new Model();
var myView = new View({model: myModel});
$("#example").html( myView.render().el );