2014-06-20 41 views
1

我正在研究一個傳統的Ember應用程序,它有一點時髦的設置,我正在嘗試清理並遵循約定。一個問題是,我們返回一個包含數組的對象,而不是從索引路由的model鉤子返回數組。所以,我包裹modelArrayProxysetupController這樣的:我可以將額外的計算屬性添加到Ember ArrayProxy中嗎?

setupController: (controller, model) -> 
    model_proxy = Ember.ArrayProxy.create({content: model.get('item')}) 
    controller.set('content', model_proxy) 

這實際工作(即content當AJAX承諾解決和model.item加載數據被更新)。問題是,我還需要在我的控制器中使用model上的另一個屬性。 model有一個needsLoader屬性,它被初始化爲true,然後在承諾解析時設置爲false。我們正在使用它來向用戶顯示一個微調器,同時從服務器獲取數據。

所以,我的問題是:有什麼辦法可以代理needsLoaderArrayProxy

一個解決方法我都試過是原來的model鉤住控制器在非標準的方式:

setupController: (controller, model) -> 
    .... 
    controller.set('_model', model) 
    .... 

這讓我從控制器訪問needsLoader致電@get('_model.needsLoader')。它可以工作,但我想在路由器中完成所有骯髒的工作,以便我可以像往常一樣調用model,在我的控制器中有一個乾淨的界面。

謝謝!

+0

我會建議你使用「模式」掛鉤,你爲什麼不使用它?如果你使用它,你將擁有路由器api提供的所有功能,就像這個http://emberjs.com/guides/routing/loading-and-error-substates/#toc_the-code-loading-代碼事件,如果您檢查代碼中的註釋,您可以將微調器放置在那裏。您也可以在ApplicationRoute中定義它,這樣,微調器將顯示所有正在加載的模型。 – fanta

+0

這只是一個數組懸掛在數組之外的簡單示例。我們使用hal,因此需要以類似的方式處理大量的元數據。 – spinlock

+0

所以,基本上,一旦所有元數據已經加載,你就設置needsLoader?你是這個意思嗎 ?因爲你可以通過模型中的承諾來做到這一點。 – fanta

回答

1

不知道它是有道理的,但你可以創建自己的類型:

var myArrayProxy = Ember.ArrayProxy.extend({ 
    countPlusTen: function(){ 
    return this.get('content.length') + 10; 
    }.property('content.length') 
}); 


var instance = myArrayProxy.create({ 
    content: [1,2,3] 
}); 

console.log(instance.get('countPlusTen')); 

例子:http://emberjs.jsbin.com/novavuqi/1/edit

+0

這不是我需要做的。這可以用於計算ArrayProxy的「內容」屬性,但是我需要ArrayProxy不知道任何關於原始模型的數據。我一直在擴展ArrayProxy和使用Array Mixin之間來回切換。 – spinlock

+0

你介意展示一個你喜歡的例子,你可以使用emberjs.jsbin.com作爲模板。 – Kingpin2k

+0

我其實只是想通了。我最終使用了MutableArray Mixin並從ArrayProxy中提取了很多代碼。一旦我完成測試,我會發佈一個更好的答案。 – spinlock

相關問題