2013-07-27 51 views
1

我試圖與一些視圖共享一個木偶應用程序。我已閱讀wiki here,但該示例給我留下了一個問題。訪問視圖中的木偶應用程序(使用Require.js)

我有一個文件,其中有幾個視圖,都將需要使用請求/響應系統和可能的命令。我不想在文件中的所有視圖中執行var MyApp = require('app');。我想出了以下內容,但我認爲可能有更好的方法來做到這一點。

例子:

//Views.js 
define(["marionette"], function (Marionette) { 
var App = function(){ 
    return require('app'); 
}; 

var ExampleItemView = Marionette.ItemView.extend({ 
    initialize: function(){ 
     App().request("getInfo", "aboutStuff"); 
    } 
}); 

return Marionette.CollectionView.extend({ 
    itemView: ExampleItemView, 
    initialize: function(){ 
     App().request("getInfo", "aboutStuff"); 
    } 
}); 

有沒有更好的方式來做到這一點?

+0

觸發您的應用程序偵聽事件? – fbynite

+0

像使用維基中的示例一樣使用全球通風口嗎?我猜這會起作用,但我只是試圖在整個應用程序中共享一些高級信息,而不是通過所有視圖作爲選項參數傳遞它。我將更新示例中的代碼。 –

+0

我剛剛找到[link](http://stackoverflow.com/a/4881496/886877)。不知道在這種情況下這是否符合法案?我會盡快測試它。 –

回答

5

我絕對不會將你的app注入到你的視圖中,因爲它可以創建循環依賴,它總是一種代碼味道(不管它們是否可以解決)到目前爲止的簡單解決方案是創建一個單獨的)reqres由應用程序處理並注入到視圖中的對象。

//reqres.js 
define(['backbone.wreqr'], function(Wreqr){ 
    return new Wreqr.RequestResponse(); 
}); 

//app 
define(['reqres'], function(reqres){ 
    reqres.setHandlers({ 
     'getInfo' : function(){ 
      return 'foo'; 
     } 
    }); 
}); 

//Views.js 
define(["marionette", "reqres"], function (Marionette, reqres) { 
var ExampleItemView = Marionette.ItemView.extend({ 
    initialize: function(){ 
     reqres.request("getInfo", "aboutStuff"); 
    } 
}); 

return Marionette.CollectionView.extend({ 
    itemView: ExampleItemView, 
    initialize: function(){ 
     reqres.request("getInfo", "aboutStuff"); 
    } 
}); 
+0

我的示例不是使用與「Marionette wiki」(OP中鏈接的)在「避免循環依賴項」部分中使用的技術相同的技術嗎? –

+0

另外,在你的例子中,有沒有一種方法將單一對象綁定到特定的「模塊」(如果應用程序中有多個「模塊」)以便在不同頁面之間移植?我猜應用程序可能總是需要wreqr,而我只能爲「模塊」命名空間處理程序。 –

+0

@Dustin是的,這與解決圓形問題的方法是一樣的,而不是**避免它們。而關於模塊化單身人士:當然。你也可以爲每個模塊創建一個reqres單例。取決於你想要做什麼。 – Creynders

2

Backbone Wreqr要通過Backbone Radio在木偶,V3的下一個主要版本所取代。

若要使用骨幹廣播,你可以創建一個頻道,執行以下操作:

/** 
* App.js (for example) 
*/ 
var Radio = require('backbone.radio'); 
// Use the 'data' channel - this could be whatever channel name you want 
var dataChannel = Radio.channel('data'); 

// Handler for a request 
dataChannel.reply('getMessage', function(name) { 
    return 'Hello ' + name + '. Alba gu brath!'; 
}); 

/** 
* View.js (for example) 
*/ 
var Radio = require('backbone.radio'); 
var dataChannel = Radio.channel('data'); 

// Make the request 
console.log(dataChannel.request('getMessage', 'Craig')); // -> Hello Craig. Alba gu brath! 
相關問題