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

Ember.js: как получить доступ к вложенным экземплярам просмотра

Скажем, я определяю вложенные представления, например (пример кода на JSFiddle):

App.ParentView = Ember.View.extend({
    ChildView: Ember.View.extend({ ... }),
    method: function() {
        this.get('ChildView') // => this is the class, not the instance :(
    }
});​

{{#view App.ParentView}}
    {{#view ChildView}}
        ...
    {{/view}}
{{/view}}

Я бы хотел избежать связывания множества атрибутов между родительским представлением и дочерним представлением. Скорее, я хотел бы сделать что-то вроде this.getPath('ChildView.foo'). Но this.get('ChildView') возвращает класс, который я создал с помощью Ember.View.extend, а не экземпляр, поэтому я не могу получить доступ к атрибутам.

Есть ли канонический способ доступа к текущему экземпляру дочернего представления из метода родительского представления?

4b9b3361

Ответ 1

Вы можете передать представление переменной viewName и получить доступ к представлению через родителя таким образом.

См. http://jsfiddle.net/Tx3NP/5/

{{#view App.ParentView}}
  {{#view childView viewName="childViewInstance"}}
     ...
  {{/view}}
{{/view}}
console.log(this.get('childViewInstance.value'));

Или вы можете это сделать, поскольку @weltraumpirat рекомендует и получает доступ к массиву this.get('childViews').

Ответ 2

Вы можете использовать массив _childViews:

 console.log( this._childViews[0].get('value') );

или вы можете дать вашему представлению id и просто использовать jQuery для доступа к соответствующему элементу HTML.

{{#view childView id="childView"}}

console.log( Em.$('#childView')[0].value );

Ответ 3

На самом деле это довольно просто.

Начиная с версии 2.10.0, если вы находитесь внутри компонента и вам нужно найти вложенный компонент, просто выполните поиск через:

  const id = 'my-specific-id-im-looking-for',
    views = this.get('childViews');

  let count = views.length;

  if (count) {
    while (--count) {
      if (views[count].get('elementId') === id) {
        // this is your view. do stuff with it, call methods on it, whatevs;
        break;
      }
    }    
  }

Если вы до этого, попробуйте использовать компонентный метод forEachChildView