1

これが機能しない理由を理解するのに苦労しています。バックボーンに 2 つのモデルがあり、イベント化されたセットアップに移行して分離したいと考えています。次のように表示する方が簡単です。

var Session = Backbone.Model.extend({
    url: '/some/url/session.js',
    initialize: function(credentials) {
        if (this.isValid() == true) {
            this.trigger("start");
        }
    },
    validate: function() {
        if (this.get("user") != "user" || this.get("password") != "pass") {
            this.trigger("end");
            return "Invalid credentials.";
        }
    }
});

var MainModel = Backbone.Model.extend({
    url: '/some/url/config.js',
    initialize: function(credentials) {
        this.session = new Session(credentials);
        this.session.on("start", this.start());
        this.session.on("end", this.end());
    },
    end: function() {
        console.debug("session ended");
    },
    start: function() {
        console.debug("session started");
    }
});


new MainModel({
  "user":"user",
  "password": "pass"
});

私が見ている問題は、インスタンス化の直後に MainModel.start() と MainModel.end() の両方が常にトリガーされていることです。リスナーを正しく追加しているかどうかわかりません。

何か案は?

ありがとう!

4

2 に答える 2

2

はい..タイプミスがあります:

これの代わりに:

this.session.on("start", this.start());

これを使って:

this.session.on("start", this.start);

最初のケースでは、関数を実行し、この関数の をコールバックとしてstart()追加してreturnいます。2 番目のケースでは、関数への参照をコールバックとして追加しています。これが必要です。

実際、私はこれを使用します:

this.session.on("start", this.start, this);

..の実行に正しいバインディングthis.start()を送信するには、これは別の話です:)

于 2012-05-07T08:16:12.130 に答える
1

this.start@fguillenは正しいです。関数呼び出しの結果ではなく、関数をバインドする必要があります。

さらに、バインディングの順序も正しくありません。でユーザーを検証していますSession.intializeが、この時点ではバインディングはまだ作成されていません。login()イベントをバインドした後に呼び出される別の関数を追加することをお勧めします。

var Session = Backbone.Model.extend({
    url: '/some/url/session.js',
    login: function(credentials) {
        if (this.isValid() == true) {
            this.trigger("start");
        }
    },
    validate: function() {
        if (this.get("user") != "user" || this.get("password") != "pass") {
            this.trigger("end");
            return "Invalid credentials.";
        }
    }
});

var MainModel = Backbone.Model.extend({
    url: '/some/url/config.js',
    initialize: function(credentials) {
        this.session = new Session(credentials);    
        this.session.on("start", this.start);
        this.session.on("end", this.end);
        this.session.login();    
    },
    end: function() {
        console.debug("session ended");
    },
    start: function() {
        console.debug("session started");
    }
});


new MainModel({
    "user":"user",
    "password": "pass"
});

ここでの作業コード: http://jsfiddle.net/mbuchetics/Ujh72/3/

于 2012-05-07T09:32:24.050 に答える