私の 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
関数は正しいコンテキストを取得していませんが、私の人生では理由を理解できません。誰が何が起こっているのかについての洞察を持っていますか?