0

私の Titanium Mobile (3.1.0 GA SDK) プロジェクトには、次のようなカスタム ライブラリがあります。

// lib/MyObject.js
function MyObject
{
    var self = this;
    _.extend(self, Backbone.Events);

    this.trigger('myEvent');
}

module.exports = MyObject;

アプリケーションの別の部分で、クラスをグローバルに利用できるようにします。

Alloy.Globals.MyObject = require('MyObject');

そして、コントローラでインスタンス化します:

var myObj = new Alloy.Globals.MyObject();

最終的にイベントリスナーが追加されるまで、そのオブジェクトは少し渡されます:

// In another controller
myObj.on('myEvent', function() {
    console.log('My event happened!');
};

残念ながら、log コマンドは呼び出されません。MyObject 関数内にイベント リスナーを追加すると、問題なく動作します。ただし、オブジェクトの外部から呼び出された場合は機能しません。

そこにバグがあるか、これを除いて、オブジェクトが参照ではなく値で渡されていると思います。クラス定義を次のように変更すると:

// lib/MyObject.js
function MyObject
{
    var self = this;
    _.extend(self, Backbone.Events);

    var old_on = this.on;
    this.on = function(a, b, c) {
        return old_on.call(self, a, b, c);
    };

    this.trigger('myEvent');
}

module.exports = MyObject;

...すべてが機能します。どういうわけか、on関数は正しいコンテキストを取得していませんが、私の人生では理由を理解できません。誰が何が起こっているのかについての洞察を持っていますか?

4

1 に答える 1