Как получить доступ к объекту массива внутри handlebars в Ember.js , когда индекс является динамическим?

#ember.js #handlebars.js

#ember.js #handlebars.js

Вопрос:

Я пытаюсь получить доступ к объекту внутри массива внутри handlebars, на Ember.js . Я пробовал следующие комбинации:

1 {{render "input-validation-message" validity.options.[_view.contentIndex]}}

2 {{render "input-validation-message" validity.options._view.contentIndex}}

3 {{render "input-validation-message" validity.options[_view.contentIndex]}}

Массив есть validity.options , а индекс есть _view.contentIndex , и это единственный известный мне способ получить доступ к индексу внутри {{#each}} циклов на Ember.js .

Ни один из трех методов не передает объект. У кого-нибудь есть решение?

Редактировать:

После некоторой игры я обнаружил, что _view.contentIndex доступ к нему не осуществляется внутри блока {{если}} или {{если}} . Мой код выглядит примерно так:

 {{#each modelArray}}
       {{#unless _view.contentIndex}}
        [code here that needs to access _view.contentIndex]
       {{else}}
        [more code here that needs to access _view.contentIndex]
       {{/unless}}
{{/each}}
 

Есть ли способ решить эту проблему?


ИСПРАВЛЕНО!

Я немного изменил правильный ответ ниже:

 {{#each item in modelArray itemController='foo'}}
   {{render "input-validation-message" item.validityOption}}
{{/each}}

App.FooController = Ember.ObjectController.extend({
  validityOption: function(){
    var model = this.get('model'),
        eachController = this.get('target'),
        parentController = eachController.get('target'),
        idx = eachController.get('content').indexOf(model);
    return parentController.get('validity.options').objectAt(idx);
  }.property('model')
});
 

Если массив не является Ember.Массив, [] не используйте objectAt() .

Комментарии:

1. вы перебираете один массив и пытаетесь получить параметры из другого массива?

2. @kingpin2k Да, каждый массив представляет собой DS.Model, тогда как массив validity.options представляет собой простой массив. Я нашел более конкретную причину ошибки, пожалуйста, проверьте правку.

Ответ №1:

Вы захотите использовать ItemController и подключить ассоциацию в контроллере

 {{#each item in modelArray itemController='foo'}}
   {{render "input-validation-message" item.validityOption}}
{{/each}}

App.FooController = Ember.ObjectController.extend({
  validityOption: function(){
    var model = this.get('model'),
        parentController = this.parentController,
        idx = parentController.indexOf(model);
    return parentController.get('validity.options').objectAt(idx);
  }.property('model')
});
 

Пример: http://emberjs.jsbin.com/ruzusiya/1/edit

Комментарии:

1. Отлично! Не знал о свойстве ItemController. Мне пришлось его немного изменить, пожалуйста, проверьте редактирование.