我的ember应用程序遇到了一个小问题,但我仍然不知道如何解决它..
我有这个错误:
Error while loading route: TypeError: Object #<Object> has no method 'addArrayObserver'
使用此代码:
<script type="text/x-handlebars" data-template-name="enquiry">
{{#link-to 'enquiries' class="create-btn"}}Back to the enquiries{{/link-to}}
<div class="enquiry-info">
<button {{action "update"}}>Update</button>
<table>
<tr>
<td>{{enquiry.customerName}}</td>
</tr>
<tr>
<td>{{customerEmail}}</td>
</tr>
<tr>
<td>{{customerPhone}}</td>
</tr>
</table>
</div>
{{outlet}}
</script>
我的控制器:
App.EnquiriesController = Ember.ArrayController.extend({
actions: {
clickBtn: function( id ) {
console.log('DEBUG: ClickBtn OK id = ' + id);
this.transitionToRoute('enquiry', id);
}
}
});
路由器:
App.EnquiryRoute = Ember.Route.extend({
model: function( param ) {
console.log('Enquiry id = ' + param.enquiry_id);
return App.Enquiries.findOne(param.enquiry_id);
}
});
为了更好地解释这一点,我有一个按钮,当用户点击它时,它会触发clickBtn功能。 在我的路由器中返回来自我的服务器的ajax调用的内容。
问题是返回一个对象,似乎ember更喜欢没有数组?
是否可以在模板中显示对象?
这是ajax调用:
findOne: function(id) {
var result = {};
$.ajax({
url: host + 'mdf/enquiry/' + id,
type: 'GET',
accepts: 'application/json',
success: function (data) {
result = data;
},
error: function() {
console.log('DEBUG: GET Enquiry ' + id + ' Failed');
}
});
return result;
}
感谢您的帮助!! :)
[编辑]
我的路由器地图:
App.Router.map(function() {
this.resource('login', { path: '/' });
this.resource('home');
this.resource('enquiries', function (){
this.route('create');
});
this.resource('enquiry', { path: '/:enquiry_id' }, function(){
this.route('update');
});
});
这是我从服务器回来的对象:
Object {ok: true, enquiry: Object}
enquiry: Object
-createdAt: "2014-02-03T15:32:16.000Z"
-customerEmail: "marco@email.com"
-customerName: "Name Test"
-customerPhone: "01523456789"
-id: 1
-__proto__: Object
ok: true
__proto__: Object
答案 0 :(得分:1)
Ember有ArrayControllers和ObjectControllers。看起来你需要声明
App.EnquiriesController = Ember.ObjectController.extend({
insted of
App.EnquiriesController = Ember.ArrayController.extend({
编辑:为了回应您的更多信息编辑,我发现了一些问题。
首先,最重要的是:您的enquiry
路由是序列化路由。因此,ember将以与其他路线不同的方式处理此路线的模型。
如果通过键入相应的URL转换到此路径,则路径将以与Ember.Route对象/模型挂钩正确对应的方式运行。 然而。如果您通过transitionToRoute('enquiry')
或{{#linkTo 'enquiry'}}
转换到此路线,则行为不正确。您的转换和linkTos应采用格式transitionToRoute('enquiry', modelObject)
和{{#linkTo 'enquiry' modelObject}}
,但是,您似乎传递了id
而不是您的ajax调用返回。
所以替换:
App.EnquiriesController = Ember.ArrayController.extend({
actions: {
clickBtn: function( id ) {
console.log('DEBUG: ClickBtn OK id = ' + id);
this.transitionToRoute('enquiry', id);
}
}
});
与
App.EnquiriesController = Ember.ArrayController.extend({
actions: {
clickBtn: function( id ) {
console.log('DEBUG: ClickBtn OK id = ' + id);
this.transitionToRoute('enquiry', App.Enquiries.findOne(id));
}
}
});
此外,在您的模板上,如果您希望访问{{enquiry.[propertyName]}}
对象中保存的属性,则所有车把助手都应采用enquiry
格式。您为customerName
正确执行了此操作,但未对其他2个属性执行此操作。
编辑#2,编辑更难:</ p>
发现了其他问题。
您的Ajax调用存在问题。您返回的对象始终是一个空对象。那是因为ajax调用是异步的。您不能依赖ajax调用以您键入的顺序运行。
以下是您的程序当前运行的顺序:
var result = {};
return result;
result = data;
...但我们已在步骤3中返回空result
!因为你的ajax调用相当简单而且你没有对返回的数据进行任何转换,所以我建议你用findOne
函数替换:{/ p>
findOne: function(id) {
return $.ajax({
url: host + 'mdf/enquiry/' + id,
type: 'GET',
accepts: 'application/json',
success: function (data) {
console.log('DEBUG: GET Enquiry ' + id + ' Succeeded');
return data;
},
error: function() {
console.log('DEBUG: GET Enquiry ' + id + ' Failed');
}
});
}
此外,回应您关于是否应将模型挂钩保留在EnquiryRoute中的评论:是。如果某人要键入与该路由关联的URL,则模型钩子将触发(因为不会给出modelObject)。如果您删除了模型挂钩,则该应用仅在单击应用内的链接时有效,如果您从网址输入应用,则会导致错误。