2014-10-07 93 views
2

我的模板中有一個Ember.Select。這些選項從我從服務器獲得的內容中填充。所有的選項都很好。但是當我想顯示選定的值時,它會將屬性設置爲undefined。Ember.Select綁定設置爲undefined

模板:

{#with this as context}} 
    {{#each}} 
    <tr> 
     <td>{{name}}</td> 
     <td>{{view Ember.Select content=context.types optionValuePath='content.id' optionLabelPath='content.name' value=type}}</td> 
    </tr> 
    {{/each}} 
{{/with}} 

控制器:

types: function() { 
    return this.store.find('myType'); 
}.property() 

型號我通過循環:

DS.Model.extend({ 
    name: DS.attr(), 
    type: DS.attr() // <= this is the selected type (id) 
}); 

MyType的模型:

DS.Model.extend({ 
    name: DS.attr() 
}); 

此代碼將呈現select元素中的所有選項。像這樣:

<select> 
    <option value="1">My first type</option> 
    <option value="2">My second type</option> 
</select> 

下面的事情我不明白:

  • 當我檢查我的數據(燼檢查插件)的屬性類型設置爲undefined。
  • 但是,當我選擇一個選項的類型屬性設置爲正確的ID。
  • 當我刪除value=type時,在檢查數據時,type屬性具有正確的值。

jsbin: http://emberjs.jsbin.com/cugetoxoyira/3/edit

+0

你可以放在一起顯示問題倉:http://emberjs.jsbin.com/ – tikotzky 2014-10-07 23:06:52

+0

加入jsbin:http://emberjs.jsbin.com/cugetoxoyira/3/編輯 – Klaasvaak 2014-10-08 07:39:24

回答

2

你有2個問題:

  1. 你選擇含量限定到一個未了的灰燼,數據的承諾(這是一個奇怪的生物本身)。您可以通過在isFulfilled屬性中進行if-ing來繞過這個問題。
  2. 這種模型的ID是字符串,而不是整數。

看看here的修復。

希望有所幫助。

+0

這確實解決了這個問題。你知道爲什麼當我將模型Stuff的屬性類型改爲:'type:DS.belongsTo('type')'。它不起作用了?請參閱:http://emberjs.jsbin。com/cugetoxoyira/39 /編輯 – Klaasvaak 2014-10-16 08:43:37

+0

不要錯過DS.belongsTo問題。我忘了在select的值屬性中添加type.id。 – Klaasvaak 2014-10-16 10:33:48

1

在控制器中使用模型承諾是反模式。路線的模型和afterModel掛鉤等待,直到解決並實現了Promise。因此,當你的控制器和你的模板呈現時,來自商店和json API的所有數據都會被正確下載並設置。

「Ember Way」解決方案是在當前Route的setupController掛鉤中設置兩個模型,所以您不必在模板中使用破解。

http://emberjs.jsbin.com/cugetoxoyira/44/edit

App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
    return Ember.RSVP.hash({ 
     stuffs: this.store.find('stuff'), 
     types: this.store.find('type') 
    }); 
    }, 

    setupController: function(controller, model) { 
    controller.set('types', model.types);   
    controller.set('model', model.stuffs); 
    } 
}); 
+0

感謝您的回答。爲什麼在控制器中有一個anitpattern的承諾?與您的答案,我會遇到問題與視圖使用渲染助手。 – Klaasvaak 2014-10-18 19:10:23

+0

在Route中,model和afterModel總是等到承諾解決。在控制器上,您必須使用它來管理它們。但是如果您的路線部分只有一個或兩個主要模型,'Ember Way'將在Route而不是Controller中管理它們。你能舉一個例子,你認爲在哪裏有問題? – Zoltan 2014-10-19 00:34:38

+1

問題是你不能像這樣重複使用你的視圖,因爲你得到了模型鉤子中的類型。當你使用渲染助手時,你可以傳入一個模型。例如另一個'Stuff'列表。但是當你這樣做時,控制器中的類型屬性沒有定義。也許更好的解決方案是爲可用類型創建新視圖,而不是將其放入控制器中。這個視圖將負責獲取所有可用的類型。 – Klaasvaak 2014-10-20 11:17:22