2014-03-24 32 views
1

在我的模型中,我成功加載了一些JSON,之後我只是將一個事件派發給正在監聽JSON的人。如何在我傳遞getJSON作爲成功回調的方法中引用我的對象?

我的問題是範圍。我發現'main'可以成功監聽模型(使用jQuery的觸發器方法)的唯一方法是使用jQuery別名爲範圍變量(在Model(ApplicationModel)函數內)添加前綴。

我的預感是我可能會錯過處理這種情況下的範圍問題。

主要

require([ "jquery", "models/applicationModel", "views/applicationView" ], function($, ApplicationModel, ApplicationView) { 

var appModel = new ApplicationModel(); 

$(appModel).on("jsonLoaded", onJsonLoaded); 
appModel.getJson(); 

function onJsonLoaded(e, data) { 
    console.log('main: onJsonLoaded', data); 
} 

}); 

應用模型

define([ "jquery" ], function($) { 

function Model() { 
    $scope = this; 
}; 

Model.prototype.getJson = function() { 
    $.getJSON("/getTextfields", this.loadSuccess); 
}; 

Model.prototype.loadSuccess = function(data) { 
    console.log('loadSuccess', data); 
    $($scope).trigger("jsonLoaded", [ data ]); 
} 

return Model; 
}); 
+0

你在哪裏定義'$ scope'? –

+0

$ scope在上面的ApplicationModel中的函數Model中定義。但是,解決方案由路易斯提供。 – user2190690

回答

1

修改你的模塊,這樣就不會是這樣的:

define([ "jquery" ], function($) { 

function Model() { 
    // Cache $(this) so that we don't call jQuery all the time. 
    this.$this = $(this); 
}; 

Model.prototype.getJson = function() { 
    // Use bind so that `this` has the proper value in `loadSuccess`. 
    $.getJSON("/getTextfields", this.loadSuccess.bind(this)); 
}; 

Model.prototype.loadSuccess = function(data) { 
    console.log('loadSuccess', data); 
    // Used the cached `$this` rather than recomputing. 
    this.$this.trigger("jsonLoaded", [ data ]); 
} 

return Model; 

}); 

這裏的關鍵是使用bind。它會創建一個新函數,將this的值設置爲傳遞給bind的第一個參數。

+0

嗨路易斯,感謝您的回答,這很清晰,有效,比我使用的解決方案更有意義。 – user2190690

相關問題