2013-09-13 12 views
2

Я пытаюсь установить выбранное по умолчанию значение поля выбора, сгенерированного с помощью {{view Em.Select}}, что должно быть довольно простой задачей в соответствии с документацией либо установкой valueBinding на соответствующее значение, либо selecitonBinding на весь представленный объект по предмету.Настройка Ember.Select Значение по умолчанию Выбранное значение

Пример кода здесь: http://jsfiddle.net/p2dtx/2/

HTML

<script type="text/x-handlebars"> 

    {{outlet}} 

</script> 

<script type="text/x-handlebars" data-template-name="index"> 

    !{{dafaultOption}}! 

    {{view Em.Select prompt="test" contentBinding="controllers.option.content" optionLabelPath="content.name" optionValuePath="content.id" valueBinding="dafaultOption" }} 
</script> 

JS

App = Ember.Application.create(); 

App.Store = DS.Store.extend({ 
    adapter: DS.FixtureAdapter 
}); 

App.Router.map(function() { 
    // put your routes here 
}); 

App.IndexController = Em.Controller.extend({ 
    dafaultOption: 'OP2', 
    needs:['option'] 
}); 

App.Option = DS.Model.extend({ 
    name: DS.attr('string') 
}); 

App.Option.FIXTURES = [ 
    { 
     id: 'OP1', 
     name: 'Option 1' 
    }, 
    { 
     id: 'OP2', 
     name: 'Option 2' 
    } 
]; 

App.OptionController = Em.Controller.extend({ 
    init: function() { 
     this._super(); 
     this.set('model', this.get('store').find('option')) 
    } 
}) 

Примечание на странице загрузки значения между !! пуст, несмотря на то, что defaultOption установлено в «OP2» в объявлении IndexController. Если я удалю опцию valueBinding с {{view Em.Select}} OP2 выводится между !! как и ожидалось, что заставляет меня поверить, что при отображении выбора он устанавливает значение indexController.defaultOption в значение null (подсказка). Когда я меняю выбор вручную, значение обновляется, как ожидалось. Есть идеи?

ответ

3

selectionBinding является правильным параметр для установки на Ember.Select, но он должен быть пункт содержится в массиве вы переходите к его contentBinding, поэтому делать это, как должен работать.

Определить свойство на вашем App.OptionController держать выбранный элемент:

App.OptionController = Em.Controller.extend({ 
    selectedOption: Ember.computed.alias('content.firstObject'), 
    init: function() { 
    this._super(); 
    this.set('model', this.get('store').find('option')) 
    } 
}); 

И установить это свойство, как ваш selectionBinding:

{{view Em.Select 
    prompt="test" 
    contentBinding="controllers.option.content" 
    optionLabelPath="content.name" 
    optionValuePath="content.id" 
    selectionBinding="controllers.option.selectedOption" }} 

Работа demo.

Надеюсь, это поможет.

+0

Спасибо, что проверю, но я не вижу причин, по которым он не должен работать. Документация определенно говорит, что 'valueBinding' также должен работать, возможно, устарел. –

+0

Действительно, это действительно помогло. Прекрасно работает после обновления emberjs до 1.0.0 и ember-data 1.0.0.beta2. Благодарю. –

+0

Меня особенно интересует эта деталь: «... но это должен быть элемент, содержащийся в массиве, который вы передаете его», потому что похоже, что моя проблема имеет к этому какое-то отношение. Я делаю некоторые копии объектов в своем коде, поэтому после некоторых операций экземпляр selectionBinding не входит в список «contentBinding» (здесь нет равенства адресов, хотя существует логическое равенство .... Я имею в виду: если все свойства экземпляра в selectBinding по сравнению с каждым элементом в cntentBinding, будет совпадение). ...Как заставить ember выполнять логическое равенство вместо равенства адресов? –

2

Вы увидите, что ваш dafaultOption в шаблоне пуст. Это порядок выполнения. Содержимое для выбора изначально пустое, поэтому Ember.Select обновляет выбор подходящего элемента (в этом случае ни один не соответствует, потому что ни один не загружен), а dafaultOption обновлен до null. Затем ваши данные загружаются и, поскольку dafaultOption is null, ни один товар не выбран.

рабочую демонстрационную с помощью Идентификаторы: http://jsfiddle.net/eZWXT/

Или вы можете использовать демо intuitivepixel, который использует объект равенства.

+0

Спасибо, что объяснили это ... Это заставляло меня бодрствовать в течение нескольких дней ... –

Смежные вопросы