0

モデルとビューがあるとします。ビューには 2 つのメソッドがあります。1 つはドキュメントの mousemove イベントをバインドし、もう 1 つは unbind メソッドです。デフォルトでは、ドキュメントの mousemove イベントを指定します。モデルのenable値が変更されたら、ビューの unbind メソッドを呼び出します。

    window.ConfigModel = Backbone.Model.extend({
        defaults: {
            'enable':0
        },
        initialize: function(){
            this.bind("change:enable", function () {
                var portView2 = new PortView();
                portView2.viewOff();                        
            });
        },
        change:function () {
            this.set('enable', 9);
        }
     })

    window.PortView = Backbone.View.extend({
        viewOn: function () {
            $(document).on('mousemove', function () {
                console.log('move')
            })
        },
        viewOff: function () {
            $(document).off('mousemove');
        }
    })

次に、input変更されたモデルを呼び出すためにドキュメントに次のように記述します。

    $('input').click(function () {
        var configModel = new ConfigModel();
        configModel.change();
    })

起動スクリプトは次のとおりです。

var portView1 = new PortView();
portView1.viewOn();

問題は、入力ボタンのクリックを呼び出すと、クロムがエラーを通知することです。何度も呼び出さMaximum call stack size exceededれるようです。change私の問題は何ですか、どうすればこの問題を解決できますか

4

1 に答える 1

1

バックボーン モデルには既にchangeメソッドがあります:

変化する model.change()

"change"イベントと、"change:attribute"変更された各属性のイベントを手動でトリガーします。{silent: true}モデルへの急速な変更を集約するために set 関数に渡していmodel.change()た場合は、すべて終了したときに呼び出す必要があります。

おそらく、バックボーン内の何かが呼び出しconfigModel.change()を試みており、バージョンの which を取得すると、バックボーン内で別の呼び出しchangeがトリガーされ、これが実行されます ... スタックが爆発するまで。change()change

メソッドには別の名前を使用する必要がありますchange


とはいえ、あなたのコード構造はやや奇妙です。それ自体でイベントをリッスンするモデルはよくできていますが、ビューを作成するモデルは奇妙です:

initialize: function() {
    this.bind("change:enable", function () {
        var portView2 = new PortView();
        portView2.viewOff();                        
    });
}

また、単に 1 つのメソッドを呼び出してから破棄するためにビューをインスタンス化するのは、イベントをトリガーするためだけに新しいモデルを作成するのと同様に奇妙です。

おそらく、アプリケーションの状態の一部として単一の ConfigModel インスタンスが必要になると思いますapp.config。次に、clickハンドラーはそのモデルと対話します。

$('input').click(function () {
    app.config.enable_level_9(); // or whatever your 'change' gets renamed to
});

app.config次に、変更をリッスンして適切に動作するアプリケーションの他の部分 (ビューである必要はありません) があります。

app.viewOn = function() {
    $(document).on('mousemove', function() {
        console.log('move')
    });
};
app.viewOff = function() {
    $(document).off('mousemove');
};
app.init = function() {
    app.config = new ConfigModel();
    app.viewOn();
    $('input').click(function () {
        app.config.enable_level_9();
    });
    // ...
};

そして、1 回のapp.init()呼び出しでアプリケーションを開始します。

$(function() {
    app.init();
});
于 2012-06-18T02:47:58.677 に答える