Подтвердить что ты не робот

Выберите раскрывающееся меню с 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}}
4b9b3361

Ответ 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