2

尽管我搜索了解决方案,但我没有找到适合我的问题的解决方案。我使用cordova和jquery mobile。触发事件:document.ready 和cordova 的设备就绪。我想通过检查布尔值来检查加载状态,以了解何时启动主应用程序。

所以看看我的代码:

首先:加载的第一个 js 文件:

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;

});

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

4

1 回答 1

3

在这行代码here

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});
于 2013-01-30T09:42:53.320 回答