2

解決策を探しましたが、問題の解決策が見つかりませんでした。私はcordovaとjquerymobileを使用しています。イベントが発生します: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);

2番目: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

このコード行はここにあります

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

this.methodとは両方でthis.intervalあるため、何も実行しないundefinedように設定します。これは、インスタンス自体のコンストラクターで渡されるプロパティを定義するのではなく、と呼ばれる内部プロパティで定義するためです。次の方法を使用して属性にアクセスできます。Backbone.Modelattributesmodel.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 に答える