我正在尝试使用ember构建一个简单的类别浏览器。我有两个非常简单的观点。当用户访问/
时,他们会看到所有类别的列表,当他们点击该列表中的某个类别时,他们会被定向到#/10
,其中10是ID。
我的问题是当用户点击/
路线上的某个类别时,我收到以下错误
TypeError: arrangedContent.addArrayObserver is not a function
[Break On This Error]
didChange: 'arrangedContentArrayDidChange'
如果我在#/10
路线刷新页面,则会对我的后端/api/categories?parent=99
进行正确的api通话。在转换期间抛出此错误,我可能做错了什么?我的代码的完整示例如下。
模板:
<script type="text/x-handlebars">
{{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="categories">
{{#each category in controller}}
<p>{{#linkTo 'category' category}}{{ category.name }}{{/linkTo}}</p>
{{/each}}
</script>
<!--this is an array instead of object -->
<script type="text/x-handlebars" data-template-name="category">
{{#each category in controller}}
<p>{{category.name}}</p>
{{/each}}
</script>
使用Javascript:
var App = Ember.Application.create();
App.Router.map(function(){
this.resource('categories', { path : '/' });
this.resource('category', { path : '/:category_id' });
});
App.CategoriesRoute = Ember.Route.extend({
model: function(){
return App.Category.find();
}
});
//this is causing the error possibly
App.CategoryRoute = Ember.Route.extend({
model: function(params){
return App.Category.find({parent: params.category_id});
}
});
App.CategoryController = Ember.ArrayController.extend();
// Models
App.Store = DS.Store.extend({
revision: 11,
adapter: 'DS.RESTAdapter'
});
DS.RESTAdapter.configure("plurals", {
category: "categories"
});
App.Category = DS.Model.extend({
name: DS.attr('string'),
parent_id: DS.attr('number')
});
调试信息:
DEBUG: Ember.VERSION : 1.0.0-rc.1
DEBUG: Handlebars.VERSION : 1.0.0-rc.3
DEBUG: jQuery.VERSION : 1.9.0
答案 0 :(得分:4)
提示:写完这篇文章后,我意识到你可能没有得到正确的模型钩子。当您通过URL输入应用程序时,会调用此挂钩。它将URL转换为适当的模型,并将此模型转换为Route。 我猜你认为这个model()钩子会被{{#linkTo}}的参数调用?事实并非如此!
这不起作用,因为您将单个模型传递给模板中的#linkTo助手。所以Ember希望将这个单个对象设置为ArrayController的内容。这会导致您的错误。你的模型钩子返回一个数组。 经验法则:您应该始终将相同的数据结构传递给您在模型钩子中返回的#linkTo。
因此我建议使用事件而不是linkTo并执行以下操作:
<script type="text/x-handlebars" data-template-name="categories">
{{#each category in controller}}
<p {{action 'showParentCategory' category}}>{{category.name}}</p>
{{/each}}
</script>
App.CategoriesRoute = Ember.Route.extend({
model: function(){
return App.Category.find();
},
events: {
showParentCategory : function(parentCategory){
var cats = App.Category.find({parent: parentCategory.get("category_id")});
this.transitionTo("category", cats);
}
}
});
我在这做了什么?
更新:如何序列化 通过实现序列化,您告诉Ember将什么内容放入您的网址。
App.CategoryRoute = Ember.Route.extend({
model: function(params){
return App.Category.find({parent: params.category_id});
},
serialize : function(models){
var first = models.objectAt(0);
return {
category_id : first.get("parentId")
}
}
});
答案 1 :(得分:0)
如果您对数字值执行#each而不是对模板中的数组内容执行操作,则会出现此问题。
我的民意调查中有一个数值计数。模特。我正在迭代,
{{#intent.count中的每个民意调查}} {{/每}}
我认为,我们必须只在ember数组上使用#each。