emberjs显示从ajax调用返回的对象

时间:2014-02-18 16:36:01

标签: ajax ember.js

我的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

1 个答案:

答案 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调用以您键入的顺序运行。

以下是您的程序当前运行的顺序:

  1. var result = {};
  2. 发送Ajax电话。
  3. return result;
  4. 我们在等待回复时有一段时间过去了....
  5. 返回Ajax调用。
  6. result = data; ...但我们已在步骤3中返回空result
  7. 因为你的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)。如果您删除了模型挂钩,则该应用仅在单击应用内的链接时有效,如果您从网址输入应用,则会导致错误。