Проблема, которую я здесь вижу, связана не столько с самим условием, сколько с тем, как вы используете свои данные. Несколько вещей:
(Вы можете увидеть больше здесь: http://jsfiddle.net/schawaska/enRhT/)
Если вы хотите, чтобы ваш шаблон реагировал на selectedB
, вы должны превратить его в вычисляемое свойство, также указав его зависимости, что в вашем случае является свойством selectedName
:
selectedB: function() {
return this.get('selectedName.id') == 2;
}.property('selectedName') // This is important
Кроме того, я заметил, что в ваших шаблонах вы назначаете свои привязки классу контроллера, а не экземпляру. Рассмотрите возможность изменения вашего приложения, включив в него Router
, что позволит вам по-другому устанавливать данные модели.
С помощью механизма маршрутизации контроллер будет назначен вашему маршруту и автоматически привязан к представлению/шаблону, поэтому вместо привязки к App.SearchController.property
вы можете сделать это с помощью controller
или controller.property
:
{{view Ember.Select class="my_custom_class"
contentBinding="controller.content"
optionValuePath="content.id"
optionLabelPath="content.firstName"
selectionBinding="controller.selectedName"}}
Это потребует еще нескольких изменений.
Настройка маршрутизатора
App.Router.map(function() {
this.route('search');
});
// this would require that you either create an IndexRoute
// to redirect from the root to the SearchRoute, or
// change the route path: this.route('search', { path: '/' });
возврат данных из функции модели маршрута, а не из контроллера
App.SearchRoute = Em.Route.extend({
model: function() {
return [
{firstName: "Any", id: 0},
{firstName: "A", id: 1},
{firstName: "B", id: 2},
{firstName: "C", id: 3},
{firstName: "D", id: 4},
{firstName: "E", id: 5}
];
}
});
Добавление {{outlet}}
в шаблон приложения
<script type="text/x-handlebars">
{{outlet}}
</script>
перемещение тела шаблона в определенный шаблон с использованием правильного controller
Теперь, поскольку маршрут предоставляет контроллер и его данные, вы должны иметь возможность использовать ключ controller
в своем шаблоне Handlebars, и он будет ссылаться на SearchController (см. ниже).
<script type="text/x-handlebars" data-template-name="search">
{{view Ember.Select class="my_custom_class"
contentBinding="controller.content"
optionValuePath="content.id"
optionLabelPath="content.firstName"
selectionBinding="controller.selectedName"}}
{{#if selectedB}}
<p>Selected: {{controller.selectedName.firstName}}
(ID: {{controller.selectedName.id}})</p>
{{else}}
<p>Select option B</p>
{{/if}}
</script>
Исправление контроллера
App.SearchController = Ember.ArrayController.extend({
selectedName: null,
selectedB: function() {
return this.get('selectedName.id') == 2 ;
}.property('selectedName')
});
Из-за соглашений об именах ваш маршрут предполагает, что ваше приложение будет иметь SearchController
(это точное имя), и именно так он соединяет все вместе. И если ваш контроллер не реализует ArrayController
, он взорвется, так как функция вашей модели теперь возвращает ModelArray
и не будет привязана к ObjectController
(по умолчанию)
person
MilkyWayJoe
schedule
09.04.2013