1

イベントの単純なメディエーター パターンを実装しようとしていますが、メディエーターに登録すると、イベント コールバックが呼び出されます。

メディエーターは次のとおりです。

define(function(require){
    'use strict';
    var _ = require('underscore');
    var Backbone = require('backbone');

    return _.extend( Backbone.Events);
});

バッキング モデルやテンプレートを使用せずに単純なビューを作成しました

define(function (require) {

'use strict';

var Backbone = require('backbone');
var mediator = require('mediator');

var Sandbox = Backbone.View.extend({

    el: '.sandbox',
    initialize: function () {
        this.render();
        this.bindEvents();
    },

    bindEvents:function(){
        mediator.on("sandbox:change", this.changeText(), this );
    },

    render: function () {
        $(this.el).html("SANDBOX VIEW IS WORKING");
    },

    changeText: function () {
        $(this.el).html("THE TEXT HAS CHANGED");
    }
});

return Sandbox;

});

ビューが読み込まれると、sandbox:changeイベントが発生し、何も呼び出されていないにもかかわらず、changeText 関数が呼び出されます。mediator.trigger('sandbox:change')

単にメディエータ オブジェクトにバインドされているときに、コールバックが呼び出されるのはなぜですか?

4

1 に答える 1

0

ブラウザがサンドボックスの変更イベント バインディングを評価するmediator.on("sandbox:change", this.changeText(), this );と、changeText 関数が実行されます。これは()、含まれているためです。本当にやりたいことは、changeText 関数オブジェクトをイベント バインディングに渡すことです。

    mediator.on("sandbox:change", this.changeText, this );

changeText はビューのメンバーであるオブジェクトであることを思い出してください。

    var Sandbox = Backbone.View.extend({
    ...
        changeText: function () {...}
    });

関数を実行する場合は、括弧を使用します。オブジェクトを参照する場合は、括弧を省略します。

于 2013-01-11T21:24:26.560 に答える