Выберите раскрывающееся меню с ember
Я пытаюсь создать выбранный ввод и передать выбранный объект в событие изменения в представлении. В примере с электронным контактом используется <ul>
, но с выбором вида должно быть вне каждого, иначе изменение даже не будет выполнено.
Вот вид js:
App.SelectView = Ember.View.extend({
change: function(e) {
//event for select
var content = this.get('content');
console.log(content);
App.selectedWidgetController.set('content', [content]);
},
click: function(e) {
//event for ul
var content = this.get('content');
console.log(content);
App.selectedWidgetController.set('content', [content]);
}
});
ul
из примера работает:
<ul>
{{#each App.widgetController.content}}
{{#view App.SelectView contentBinding="this"}}
<li>{{content.name}}</li>
{{/view}}
{{/each}}
</ul>
Но если я заменяю html напрямую, событие изменения не запускается (что имеет смысл)
<select>
{{#each App.widgetController.content}}
{{#view App.SelectView contentBinding="this"}}
<option>{{content.name}}</option>
{{/view}}
{{/each}}
</select>
Итак, я думаю, что выбор должен быть обернут в представлении.. в этом случае, как передать соответствующий объект?... Этот код приводит к передаче всего массива:
{{#view App.select_view contentBinding="App.widgetController.content"}}
<select>
{{#each App.widgetController.content}}
<option>{{name}}</option>
{{/each}}
</select>
{{/view}}
Ответы
Ответ 1
У Ember теперь есть встроенное представление Select.
Вот пример использования:
var 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.selectedPersonController = Ember.Object.create({
person: null
});
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'})
]
});
Ваш шаблон будет выглядеть так:
{{view Ember.Select
contentBinding="App.peopleController"
selectionBinding="App.selectedPersonController.person"
optionLabelPath="content.fullName"
optionValuePath="content.id"}}
Опять же, здесь пример jsFiddle: http://jsfiddle.net/ebryn/zgLCr/
Ответ 2
проверьте ответы на аналогичный вопрос: Как связать ввод формы формы выберите атрибут в контроллере
В примерах CollectionView используется с tagName = select. Вы можете найти это полезным при работе.
EDIT: Поскольку я искал реализацию выбора самостоятельно, вот решение, которое я придумал:
просмотров/form.js.hjs:
{{#view contentBinding="App.typeController" valueBinding="type" tagName="select"}}
{{#each content}}
<option {{bindAttr value="title"}}>{{title}}</option>
{{/each}}
{{/view}}
{{#view Ember.Button target="parentView" action="submitEntry"}}Save{{/view}}
Выбор является частью формы. Я проверяю событие отправки и там читаю значение:
app.js.coffee
# provides the select, add value: 'my_id' if you need differentiation
# between display name (title) and value
app.typeController = Ember.ArrayProxy.create
content: [{title:'Energy'}, {title:'Gas'}, {title:'Water'}]
# simplified version, but should prove the point
app.form_view = Ember.View.create
templateName: 'views_form'
type: null
submitEntry: () ->
console.log this.$().find(":selected").val()
Надеюсь, что это поможет.
Ответ 3
Это не ответ, просто исправление на сломанной ссылке jsfiddle. Очевидно, у jsfiddle нет любви к ember:/Но JsBin делает! http://jsbin.com/kuguf/1/edit