如何将json响应存储到模型ember.js中

时间:2014-08-19 20:52:04

标签: ember.js

我不确定如何将json数据存储到控制器中的模型中。这是我的代码。

App.LoginController = Ember.ObjectController.extend({


    actions: {
        login: function() {
            var data = this.getProperties("email", "password");
            console.log(data);
            return $.post('/', {
                email: data.email,
                password: data.password
            }).then(function(data) {
                if(data.isFail) {
                    return data;
                } else {

                }
            });

        }
    }
});

后行if(data.isFail){....我想将json数据存储到模型中。我该怎么做?

更新 我和Josh建议将行动放入路线

App.LoginRoute = Ember.Route.extend({
    actions : {
        login: function() {
            var data = this.getProperties("email", "password");
            console.log(data);
            return $.post('/', {
                email: data.email,
                password: data.password
            }).then(function(data) {
                if(data.isFail) {
                    store.createRecord('login', data);
                } else {

                }
                return data;
            });

        }

    }
});

不,我收到错误未捕获的TypeError:无法读取属性'规范化'未定义的。

1 个答案:

答案 0 :(得分:1)

如果您定义了DS.Model,并且您的JSON内容是DS.Model中定义的属性的子集,那么您可以这样做:

store.createRecord('my-model-name', data);

这假设您有一个名为DS.Model的{​​{1}},并且您的JSON位于my-model-name.js var中。如果您的JSON中有一些属性<{1>}中未定义 ,我不确定Ember Data是如何做出反应的。

更新:您询问了如何连接路由和控制器。你可以用这个成语:

data

请注意,这与您原来的问题并没有多大关系。

更新#2:

好的,看起来你想要尝试登录,然后如果POST请求成功,但登录本身失败(如json响应中存在DS.Model属性所示),那么你想在本地商店创建新记录?我是否正确描述了您的意图?

我的第一个问题是,你确定要在这里创建一个Ember记录吗? Ember记录基本上是来自您的后端/数据库的“真实”对象的“传真”。如果你想最终坚持某个地方(例如通过调用Ember.Route.extend({ setupController: function(controller, model) { this._super(controller, model); controller.set('myProperty', 'hello'); controller.set('meta', this.store.metadataFor('org-user')); } }) ),那么创建一个新的本地记录是有意义的。也许你会创建一个仅用于缓存目的的本地记录,但我个人还没有在野外看到它(但如果你已经考虑过,不要让我取消你的使用资格)。

有了这个,我们假设你想创建一个本地记录。然后我们首先需要一个代表记录的DS.Model。我将这样定义为:

<强>模型/ login.js

isFail

请注意,我确保从myRecord.save复制您的属性,因为您使用DS.Model.extend({ username: DS.attr('string'), password: DS.attr('string') }); 初始化模型的方式意味着this.getProperties()中的内容需要成为我的一部分刚刚定义如上。

现在我有一个模型定义,我从后端通过JSON(或任何其他格式,只要我有正确的序列化器)获取此模型的实例; Ember默认使用`RESTSerializer,它需要JSON)。我也可以在本地实例化一个新模型,或者在Ember说话,创建一个记录。同样,我创建新记录的目标可能是我最终希望将其保留到我的后端。但是既然你正在做自己的AJAX调用,我会把那部分留下来。

现在进入您的代码,稍作修改:

createRecord('login', data)

我拿出了data语句因为我猜你不需要它们(我可能错了)。我还决定用我们刚刚创建的模型实例做一些事情,在这种情况下App.LoginRoute = Ember.Route.extend({ actions : { login: function() { var _this = this; var data = this.getProperties("email", "password"); $.post('/', { email: data.email, password: data.password }).then(function(data) { if(data.isFail) { var loginModel = _this.store.createRecord('login', data); loginModel.save(); // not sure if you want to do this? } else { } }); 它会触发对你的后端的POST请求,由你的适配器决定(默认情况下,Ember使用return确定这个。)

另请注意,我需要通过save()访问当前路由实例,但RESTAdapter在我下载代码时具有不同的含义,所以我在顶部定义this所以我我需要时可以参考“真实”这个。

这会解决您的问题吗?