Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将json响应存储到ember.js模型中_Ember.js - Fatal编程技术网

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

如何将json响应存储到ember.js模型中,ember.js,Ember.js,我不知道如何将json数据存储到控制器中的模型中。这是我的密码 App.LoginController = Ember.ObjectController.extend({ actions: { login: function() { var data = this.getProperties("email", "password"); console.log(data); return $.pos

我不知道如何将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数据存储到一个模型中。我该怎么做

更新 我同意乔希的建议,把行动付诸实施

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;
            });

        }

    }
});

不,我收到一个错误Uncaught TypeError:无法读取未定义的属性“normalize”。

如果您定义了
DS.Model
,并且如果JSON的内容是
DS.Model
中定义的属性的子集,则可以执行以下操作:

store.createRecord('my-model-name', data);
这假设您定义了一个名为
my Model name.js
DS.Model
,并且您的JSON位于
data
变量中。如果您的JSON中有一些属性未在
DS.Model
中定义,我不确定余烬数据会如何反应

更新:您询问了如何连接路由和控制器。您可以使用以下习惯用法:

Ember.Route.extend({
    setupController: function(controller, model) {
        this._super(controller, model);
        controller.set('myProperty', 'hello');
        controller.set('meta', this.store.metadataFor('org-user'));
    }
})
请注意,这与您最初的问题没有太大关系

更新#2:

好的,看起来您想尝试登录,然后如果POST请求成功,但登录本身失败(如json响应中出现的
isFail
属性所示),那么您想在本地存储中创建一个新记录?我描述了您的意图吗

我的第一个问题是,您确定要在此处创建余烬记录吗?余烬记录基本上是来自后端/数据库的“真实”对象的“传真”。如果您希望最终在某个地方保留该记录(例如,通过调用
myRecord.save
),则创建新的本地记录是有意义的.也许你会创建一个仅用于缓存目的的本地记录,但我个人还没有在野外看到过(但如果你仔细考虑的话,请不要让我取消你的使用资格)

这样,我们假设您确实想要创建一个本地记录。然后首先,我们实际上需要一个DS.Model来表示这将是的记录。我将这样定义我的记录:

models/login.js

DS.Model.extend({
   username: DS.attr('string'),
   password: DS.attr('string')
});
请注意,我确保从
this.getProperties()
复制您的属性,因为您使用
createRecord('login',data)
初始化模型的方式意味着
data
中的内容需要是我刚才定义的内容的子集

现在我有了一个模型定义,我可以通过JSON从后端获取该模型的实例(或者任何其他格式,只要我有正确的序列化程序;默认情况下,Ember使用`RESTSerializer,它需要JSON)。我也可以在本地实例化一个新模型,或者用Ember的话说,创建一个记录。同样,我创建一个新记录的目标可能是最终要将它保留到我的后端。但由于您正在进行自己的AJAX调用,所以我将省略该部分

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

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 {

                }                
            });
我取出了
return
语句,因为我猜您不需要它们(我可能错了)。我还决定对我们刚刚创建的模型实例执行一些操作,在本例中是
save()
it,它将触发对后端的POST请求,这由适配器决定(默认情况下,Ember使用
RESTAdapter
来确定这一点)

还请注意,我需要通过
this
访问当前路由实例,但是
this
在我向下移动代码时具有不同的含义,因此我在顶部定义
var\u this=this;
,以便在需要时可以引用“real”this


这是否解决了您的问题?

它说明没有定义存储。我的App.js中有App.store=DS.store.extend();我是否遗漏了其他内容?您可以使用
this.store
。我在API文档中查找
Ember.Controller
()令人惊讶的是,
store
没有定义!但是如果你看一下,你会发现它是可用的。顺便说一句,随着你对余烬的深入,你会了解到“余烬之路”在这种情况下,你应该考虑把这个逻辑放在你的路线中,因为这涉及到数据。看,我正在寻找一个关于控制器和路线的讨论,但是找不到。基本上,通常建议控制器限于“装饰”。当路由用于实际下载/上传/推送/存储数据时,您的模型。关于
这一点
,请注意您所处的环境(在您的情况下,是控制器).
引用了其中一个。然后转到Ember API,看看您可以用
此来做什么。
我不确定如何将控制器连接到路由。我似乎无法在操作登录上触发路由。我有这个setupController:function(controller,model){controller.set('model',model);}但它仅在页面加载时执行。是否有一个用于执行操作的实例?也许这就是您要查找的?控制器和路由都可以定义操作,但您必须在
操作
属性中定义它们。它们在该链接上的示例应同样适用于控制器和路由。操作在响应中发生对于发生的某些事件,通常通过使用把手模板中的
{{action'myActionName'}}
用法触发。