Javascript Ember.js:如何访问嵌套视图实例

Javascript Ember.js:如何访问嵌套视图实例,javascript,ember.js,Javascript,Ember.js,假设我正在定义嵌套视图,如()所示: 我希望避免在父视图和子视图之间绑定很多属性。相反,我想做一些类似于this.getPath('ChildView.foo')的事情。但是this.get('ChildView')返回我用Ember.View.extend创建的类,而不是实例,因此我无法访问属性 是否有从父视图的方法内部访问子视图的当前实例的规范方法?您可以使用\u childview数组: console.log( this._childViews[0].get('value') );

假设我正在定义嵌套视图,如()所示:

我希望避免在父视图和子视图之间绑定很多属性。相反,我想做一些类似于
this.getPath('ChildView.foo')
的事情。但是
this.get('ChildView')
返回我用Ember.View.extend创建的类,而不是实例,因此我无法访问属性


是否有从父视图的方法内部访问子视图的当前实例的规范方法?

您可以使用
\u childview
数组:

 console.log( this._childViews[0].get('value') );
或者,您可以为视图提供一个id,只需使用jQuery访问相应的HTML元素

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

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

您可以通过
viewName
变量传递视图,并通过父视图访问该视图


或者,您可以按照@weltraumpirat的建议,访问
this.get('childview')
数组。

实际上非常简单

从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

在我看来,
viewName
绑定是ember.js作者打算让您使用的,
\u childViews
在我看来是私有的。如果您有多个实例,则为视图提供id没有帮助。谢谢,这非常有用。我采用了一种惯例,即调用我的类
ChildView
(大写),并使用
viewName=“ChildView”
(非大写)作为实例名称。这使它相当容易理解。@Bradley,在你的例子中,
getPath
get
之间有什么区别吗,如果
这个
引用了父视图?@Sherwin
getPath
自从这个答案发布以来就被弃用了,
get
现在是合适的方法。这个方法非常有效,但我在任何地方都找不到记录。未记录的特性往往会在没有警告的情况下消失。如果有人发现它有文档记录,请发布链接。我在道德上反对像第二个例子那样从DOM中提取应用程序数据。;-)但是使用
\u childview
的指针很好,即使它是私有的。是否存在只返回非虚拟视图的等价物?
{{#view App.ParentView}}
  {{#view childView viewName="childViewInstance"}}
     ...
  {{/view}}
{{/view}}
console.log(this.get('childViewInstance.value'));
  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;
      }
    }    
  }