嘿,不确定是否有人可以帮助我,但很长一段时间以来我一直在努力解决此错误:"Uncaught TypeError: Object <App.AssetType:ember408:2> has no method 'addArrayObserver'"
这是带有{{#linkTo}}
的模板,单击该模板会产生此错误
<div class="row">
<div class="twelve columns">
<h2>{{title}} - Assets</h2>
</div>
</div>
<div class="row">
<div class="three columns">
<ul>
{{#each assetTypes}}
{{#linkTo 'product.filter' this}}{{title}}{{/linkTo}}
{{/each}}
</ul>
</div>
<div class="nine columns">
{{outlet}}
</div>
</div>
和应用程序代码
window.App = Ember.Application.create
rootElement: '.solution_products_documents'
App.ApplicationRoute = Ember.Route.extend
model: ->
App.Product.find()
App.ApplicationController = Ember.ArrayController.extend
sortProperties: ['title']
App.ProductRoute = Ember.Route.extend
model: (params) ->
App.Product.find params.product_id
setupController: (controller, model) ->
controller.set 'documents', model.get 'document_ids'
App.ProductController = Ember.ObjectController.extend
assetTypes: (->
docs = @get('documents')
docs.getEach 'asset_type_id'
).property('documents')
App.ProductFilterRoute = Ember.Route.extend
model: (params) ->
type = App.AssetType.find params.asset_type_id
product = this.modelFor 'product'
docs = product.get 'document_ids'
model = docs.filterProperty 'asset_type_id', type
App.ProductFilterController = Ember.ArrayController.extend()
App.Router.map ->
@route 'index', { path: '/' }
@resource 'product', { path: '/products/:product_id' }, ->
@route 'filter', { path: '/filter-by/:asset_type_id' }
##
# MODELS / EMBER-DATA
##
serializer = DS.JSONSerializer.create()
serializer.configure 'App.Document',
sideloadAs: 'documents'
serializer.configure 'App.AssetType',
sideloadAs: 'asset_types'
serializer.configure 'App.Product',
sideloadAs: 'products'
App.RestAdaptor = DS.RESTAdapter.extend
serializer: serializer
namespace: URL.slice 1
DS.Store.extend(
adapter: App.RestAdaptor
revision: 11
).create()
App.Product = DS.Model.extend
title: DS.attr 'string'
document_ids: DS.hasMany 'App.Document'
App.Document = DS.Model.extend
title: DS.attr 'string'
product_id: DS.belongsTo 'App.Product'
asset_type_id: DS.belongsTo 'App.AssetType'
App.AssetType = DS.Model.extend
title: DS.attr 'string'
document_ids: DS.hasMany 'App.Document'
######### /> END MODELS #################
如果将URL
#/products/4/filter-by/2
放入地址栏中,则一切按计划进行。仅当我单击{{#linkTo}}
时,才出现此错误,并且不显示内容。该错误在到达App.ProductFilterRoute
之前就被抛出,因为该路由中的debugger
语句没有执行,但它是页面刷新的。非常感谢您的帮助或指导,因为我真的不知道在哪里寻找。
更新:
如果我不使用
{{#linkTo}}
帮助器,而是手动构造url<a href="#/products/{{unbound controller.content.id}}/filter-by/{{unbound this.id}}">{{title}}</a>
一切正常。 linkTo和manual href有什么区别?
最佳答案
该错误基本上表明,当您导航到ProductFilterRoute时,Ember需要一个数组。
为什么Ember在这里需要一个数组?
为什么会引发错误?
因此,您的路线围绕数组旋转。您只传递了一个普通对象。因此,黄金法则是:将相同的数据结构(在这种情况下为数组)传递给{{linkTo}}帮助器,该帮助器由模型挂钩实现返回。
可能的解决方案:
对模板的修改:
<a {{action 'filterProductByAsset' this}}> {{title}} </a>
ProductFilterRoute的扩展:
events:{
filterProductByAsset : function(assetTypeId){
type = App.AssetType.find(asset_type_id);
product = this.modelFor('product');
docs = product.get('document_ids');
models = docs.filterProperty('asset_type_id', type);
this.transitionTo("product.filter", models)
}
}
关于ember.js - {{#linkTo}}单击期间没有方法 'addArrayObserver',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15177093/