Ember.js:数据感知组件和组件内通信
我在一个模板上有两个组件,一个是搜索向导,它允许您将搜索项添加到表中,然后使用搜索项构建一个“查询”,返回类型为(我们称之为)“小部件”的对象 第二个组件是类型为X的对象的查看器,它根据某些特征对对象进行分组 我的路线是传统的ArrayController路线: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 这两个组件在我拥
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)搜索向导。它们都位于同一模板中,应使用向导搜索结果加载到查看器中,默认情况下,查看器使用主机控制器的模型(即查找所有特定模型)