我花了大約10天時間處理了一個簡單的問題,我可以在10分鐘內用Dojo解決這個問題。我希望我缺少一些簡單的東西 - 我是一個願意使用Ember的小菜鳥。使用EmberData填充Ember.Select使用EmberData延遲加載
我只是試圖用另一個控制器中的數據使用EmberData填充Ember.Select的內容。考慮一下這種情況:能夠選擇一種食品組作爲原料。
在RawIngredientController和FoodGroupsController之間使用'needs'依賴似乎很清楚,並且綁定了內容。
這是我接近成功的最接近的,它對我來說不夠 - 我會解釋。
<script type="text/x-handlebars" data-template-name="rawIngredients">
{{#each item in controller itemController="rawIngredient" }}
{{! view Ember.Select
contentBinding="controllers.foodGroups.content"
optionValuePath="content.id"
optionLabelPath="content.name"
prompt="select Food Group" }}
{{/each}}
</script>
Cook.RawIngredientController = Ember.ObjectController.extend({
isEditing: false,
needs: ['foodGroups'],
...
});
Cook.RawIngredient = DS.Model.extend({
name: DS.attr('string'),
nameKey: DS.attr('string'),
foodGroup: DS.belongsTo('Cook.FoodGroup')
});
Cook.FoodGroupsRoute = Ember.Route.extend({
setupController: function(controller) {
controller.set('content', Cook.FoodGroup.all()); // have also tried find()
}
});
Cook.FoodGroup = DS.Model.extend({
name: DS.attr('string'),
nameKey: DS.attr('string')
});
這實際上使得沒有任何錯誤都RawIngredients,但選擇是空的,因爲FoodGroups存儲爲空。我可以導航到加載商店的FoodGroups屏幕,返回到RawIngredients,並將選擇填入FoodGroups。
我在這個問題上看到了很多帖子,但是當涉及到EmberData時,沒有一個足以解決這個問題。有很多後加載的例子,像這個來自pangratz http://jsfiddle.net/pangratz/hcxrJ/的聰明的例子 - 但我還沒有發現任何使用EmberData來延遲加載內容。
這個職位是非常接近 Ember.js: Ember.Select valueBinding and lazy loading
,幷包含使用觀測,這是我不能去上班一種解決方法。我最終綁定了一個從未調用FoodGroup數據實際加載的綁定。下面是一個例子,也許不是最好的,(大概20+)一個這樣的嘗試:
Cook.FoodGroupsController = Ember.ArrayController.extend({
...
// NOTE: This seems redundant
values: function() {
return this.get('content');
}.property(),
...
});
Cook.RawIngredientController = Ember.ObjectController.extend({
...
// this should be the instance; also tried the object name FoodGroupsController....also tried using needs + 'controllers.foodGroups.values' in the binding
allFoodGroups: Ember.Binding.oneWay('Cook.foodGroupsController.values'), '
/*
// ... or rather ....??
allFoodGroups: function() {
this.get('foodGroupsBinding');
},
foodGroupsBinding: "Cook.foodGroupsController.values",
*/
...
});
{{view Ember.Select
contentBinding="allFoodGroups"
optionValuePath="content.id"
optionLabelPath="content.name"
prompt="select Food Group" }}
但它錯誤說「allFoodGroups」是提供一個不綁定的Ember.Array。我認爲我迷失在一片旋轉的命名約定中。我可以在此顯示我的其他嘗試,但都有錯誤的內容未定義。
呃。因此,備份了一點......至少使用我的原始解決方案並預加載FoodGroups存儲應該提供解決方法,但是我似乎無法通過編程方式讓EmberData出去並加載數據。我嘗試了RawIngredientController中的init()函數,如
init: function() {
var item = this.get('controllers.foodGroups.content.firstObject');
},
但我還沒有找到正確的組合。即使我這樣做,這似乎是錯誤的方法,因爲這將爲每個RawIngredient建立一個參考,而不是使用來自RawIngredients(或FoodGroups?)的單一參考 - 但這似乎是一個不同的主題。
這是我在描述問題http://jsfiddle.net/jockor/Xphhg/13/
有沒有人想出裝載貨物和其他控制器定義使用存儲的高效,有效的途徑小提琴嘗試使用EmberData懶加載相關的內容?
謝謝你,我已經從你的回覆中學到了很多東西。我根據你的更新更新了我的小提琴:http://jsfiddle.net/jockor/Xphhg/17/,現在我正在嘗試以編程方式調用ApplicationController.init()內的Country路由,以便預加載而無需點擊鏈接。我嘗試了一些方法,並沒有找到正確的方法 - 通常我試圖通知路由器調用/國家,但是無論如何我都會得到'無處理程序'錯誤。有任何想法嗎? – user2003699 2013-04-08 10:24:25
我有一個版本工作(方法4),更新的小提琴在這裏 - http://jsfiddle.net/Xphhg/23/。不知道它是否是最好的模式,但對我來說看起來很合理。 – user2003699 2013-04-08 13:42:12