データの値 (通常は実行時に取得される) をフォーム要素にバインドする必要があるシナリオがあります。この場合、要素は任意の長さのデータ セットに対して繰り返しレンダリングされる Ember.Select です。
jsFiddle はここにあります簡単な例
<script type="text/x-handlebars">
{{#each App.simpleSelectionArray.content}}
{{this.firstName}}
{{view Ember.Select
contentBinding="App.peopleController.content"
selectionBinding="this"
optionLabelPath="content.fullName"
optionValuePath="content.id"}}
<p>Selected: {{this.fullName}}
(ID: {{this.id}})</p>
{{/each}}
{{#each App.selectionArray.content}}
{{this.person.firstName}}
{{view Ember.Select
contentBinding="App.peopleController.content"
selectionBinding="this.person"
optionLabelPath="content.fullName"
optionValuePath="content.id"}}
<p>Selected: {{this.person.fullName}}
(ID: {{this.person.id}})</p>
{{/each}}
</script>
</p>
window.App = Ember.Application.create();
App.Person = Ember.Object.extend({
id: null,
firstName: null,
lastName: null,
fullName: function() {
return this.get('firstName') + " " + this.get('lastName');
}.property('firstName', 'lastName').cacheable()
});
App.peopleController = Ember.ArrayController.create({
content: [
App.Person.create({id: 1,firstName: 'Yehuda',lastName: 'Katz'}),
App.Person.create({id: 2,firstName: 'Tom',lastName: 'Dale'}),
App.Person.create({id: 3,firstName: 'Peter',lastName: 'Wagenet'}),
App.Person.create({id: 4,firstName: 'Erik',lastName: 'Bryn'})
]
});
App.simpleSelectionArray = Ember.ArrayController.create({
content: [
App.peopleController.objectAt(1)
]});
App.selectionArray = Ember.ArrayController.create({
content: [
{
id: '2',
person: Ember.computed(function(key, value) {
if (arguments.length === 1){
var personId = this.get('id');
console.log(personId);
var listedPerson = App.peopleController.content.findProperty("id", personId);
return listedPerson ;
}else{
this.set(key,value);
return value;
}
}).property('id').cacheable()
},
]});
生成された 2 つの select 要素は、異なるデータ構造に基づいています。最初の (ほとんど) は、バインディング ポストの選択を除いて、期待どおりに動作します。
より典型的な2番目のデータ構造は、私にとってはまったく機能していません。
何かご意見は?