Ember.js:数据感知组件和组件内通信

Ember.js:数据感知组件和组件内通信,ember.js,ember-data,Ember.js,Ember Data,我在一个模板上有两个组件,一个是搜索向导,它允许您将搜索项添加到表中,然后使用搜索项构建一个“查询”,返回类型为(我们称之为)“小部件”的对象 第二个组件是类型为X的对象的查看器,它根据某些特征对对象进行分组 我的路线是传统的ArrayController路线: Ember : 1.4.1+pre.af87bd20 Ember Data : 1.0.0-beta.7.f87cba88 Handlebars : 1.3.0 jQuery : 2.1.0 这两个组件在我拥

我在一个模板上有两个组件,一个是搜索向导,它允许您将搜索项添加到表中,然后使用搜索项构建一个“查询”,返回类型为(我们称之为)“小部件”的对象

第二个组件是类型为X的对象的查看器,它根据某些特征对对象进行分组

我的路线是传统的ArrayController路线:

Ember      : 1.4.1+pre.af87bd20 
Ember Data : 1.0.0-beta.7.f87cba88 
Handlebars : 1.3.0 
jQuery     : 2.1.0 
这两个组件在我拥有的模板(widgets.hbs)上分别运行良好:

在组件中,doSearch操作尝试设置模型:

{{search-widgets-by-attribute model=content}}
{{search-widgets-by-attribute widgetsController=controller}}
searchByTypeAndUrl返回一个小部件数组。设置上述模型将导致:

MyApp.SearchWidgetsByAttributeComponent = Ember.Component.extend(
  ...
  actions:
    doSearch: ->
        component = @
        store = MyApp.__container__.lookup('store:main')
        store.searchByTypeAndUrl("widget", "/widgets/search",
          search:
            attribute_names: @.get('searchAttributes')
        ).then (searchResults) ->
          component.set('model', searchResults)
)
MyApp.SearchWidgetsByAttributeComponent = Ember.Component.extend(
  ...
  actions:
    doSearch: ->
        widgetsController = @.get('widgetsController')
        store = MyApp.__container__.lookup('store:main')
        store.searchByTypeAndUrl("widget", "/widgets/search",
          search:
            attribute_names: @.get('searchAttributes')
        ).then (searchResults) ->
          widgetsController.set('model', searchResults)
)
结果:

MyApp.SearchWidgetsByAttributeComponent = Ember.Component.extend(
  ...
  actions:
    doSearch: ->
        component = @
        store = MyApp.__container__.lookup('store:main')
        store.searchByTypeAndUrl("widget", "/widgets/search",
          search:
            attribute_names: @.get('searchAttributes')
        ).then (searchResults) ->
          component.set('model', searchResults)
)
MyApp.SearchWidgetsByAttributeComponent = Ember.Component.extend(
  ...
  actions:
    doSearch: ->
        widgetsController = @.get('widgetsController')
        store = MyApp.__container__.lookup('store:main')
        store.searchByTypeAndUrl("widget", "/widgets/search",
          search:
            attribute_names: @.get('searchAttributes')
        ).then (searchResults) ->
          widgetsController.set('model', searchResults)
)
我还尝试过使用Em.array、Em.ArrayProxy和Em.MutableArray包装简单的JS小部件数组,但没有成功

2) 通过属性将控制器传递给搜索小部件 在组件中,doSearch操作尝试设置模型:

{{search-widgets-by-attribute model=content}}
{{search-widgets-by-attribute widgetsController=controller}}
结果:

MyApp.SearchWidgetsByAttributeComponent = Ember.Component.extend(
  ...
  actions:
    doSearch: ->
        component = @
        store = MyApp.__container__.lookup('store:main')
        store.searchByTypeAndUrl("widget", "/widgets/search",
          search:
            attribute_names: @.get('searchAttributes')
        ).then (searchResults) ->
          component.set('model', searchResults)
)
MyApp.SearchWidgetsByAttributeComponent = Ember.Component.extend(
  ...
  actions:
    doSearch: ->
        widgetsController = @.get('widgetsController')
        store = MyApp.__container__.lookup('store:main')
        store.searchByTypeAndUrl("widget", "/widgets/search",
          search:
            attribute_names: @.get('searchAttributes')
        ).then (searchResults) ->
          widgetsController.set('model', searchResults)
)
3) 使用find方法设置模型 这就行了!但这不是我想要的:-(我从中得到的提示是,我似乎需要一个DS.RecordArray

Uncaught TypeError: Cannot read property 'firstChild' of null
firstNodeFor 
prependFunc 
DOMManager.prepend 
insertViewCollection
Ember.merge.ensureChildrenAreInDOM 
Ember.ContainerView.Ember.View.extend._ensureChildrenAreInDOM 
DeferredActionQueues.flush 
Backburner.end 
(anonymous function)
下一步。。。
searchByTypeAndUrl
的代码如下所示:

 MyApp.SearchWidgetsByAttributeComponent = Ember.Component.extend(
  ...
  actions:
    doSearch: ->
        store = MyApp.__container__.lookup('store:main')
        component = @
        store.find('specification').then (specifications) ->
          component.set('model', specifications)
我尝试在路由的模型钩子中将模型设置为空数组,但即使在执行上面的#3操作时,我也得到了null的第一个子元素


我最后一次尝试是让
searchByTypeAndUrl
返回一个RecordArray。欢迎任何建议。

只是为了让我正确理解:您有一个搜索组件,您希望能够根据搜索内容更改控制器的型号。正确吗?是的,有两个组件1)一个查看器(具有分组功能的表)和2)搜索向导。它们都位于同一模板中,应使用向导搜索结果加载到查看器中,默认情况下,查看器使用主机控制器的模型(即查找所有特定模型)