Backbone.js Timer - 无用的setInterval调用

时间:2013-01-30 09:38:34

标签: javascript jquery-mobile backbone.js

虽然我搜索了一个解决方案,但我找不到一个问题。我使用cordova和jquery mobile。有事件被解雇:document.ready和cordova准备好的设备。我想检查加载状态,检查布尔值,知道何时启动主应用程序。

所以看看我的代码:

首先:加载第一个js-File:

function checkReadyStates() {
    if(domReady && cordovaReady) {
        timer.stop();
        start();
    }
}

var domReady = false;
var cordovaReady = true;
var timer = new TimerModel({interval : 50, method : checkReadyStates});
timer.start();

// get notified when DOM is loaded
$(document).ready(function() {
    ConsoleController.info('Document ready.');
    domReady = true;
});

// get notified when cordova is ready
document.addEventListener('deviceready', function() {
    ConsoleController.info('Cordova loaded.');
    cordovaReady = true;
}, false);

第二:TimerModel:

define(['backbone'],function(Backbone) {

var model = Backbone.Model.extend({

    defaults: {
        timerObject : null,
        active : false,
        interval : 1000,
        method : null,
    },

    // init timer
    initialize : function() {
        _.bindAll(this, 'start', 'stop'); // context bindings
    },

    // starts the timer with given interval
    start : function() {
        if(!this.active) {
            this.active = true;
            this.timerObject = setInterval(this.method, this.interval);
        }
    },

    // stops timer
    stop : function() {
        this.active = false;
        clearInterval(this.timerObject);
    }

});

// return the timer model
return model;

});

希望有人能够提供帮助。谢谢!

1 个答案:

答案 0 :(得分:3)

在这行代码

this.timerObject = setInterval(this.method, this.interval);

this.methodthis.interval都是undefined,因此您设置的正在运行 never 。原因是Backbone.Model没有定义实例本身的构造函数中传递的属性,而是定义了一个名为attributes的内部属性。您可以使用model.get(property)方法访问属性:

this.timerObject = setInterval(this.get('method'), this.get('interval'));

此外,将计时器定义为模型并没有多大意义。毫无疑问,你会让它发挥作用,但它不是Backbone.Model的目的。模型用于表示data的一部分,而不是功能。我认为一个简单的功能会在这里为你提供更好的服务。

编辑:对于数据,模型不仅仅 ,但它们应包含数据。该模型是定义对该数据进行操作的函数(方法)的好地方。另一方面,TimerModel是纯逻辑 - 它不代表或封装任何数据或状态。我认为逻辑更好地封装为一个简单的函数“类”:

var Timer = function(options) {
    options = options || {};
    this.active = false;
    this.interval = options.interval || 1000;
    this.method = options.method || null;


    // starts the timer with given interval
    this.start = function() {
        if(!this.active) {
            this.active = true;
            this.timerObject = setInterval(this.method, this.interval);
        }
    };

    // stops timer
    this.stop = function() {
        this.active = false;
        clearInterval(this.timerObject);
    };

    _.bindAll(this, 'start', 'stop')
});

用法:

var timer = new Timer({interval: 50, method:checkReadyStates});