如何将json响应存储到ember.js模型中
我不知道如何将json数据存储到控制器中的模型中。这是我的密码如何将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
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'}}
用法触发。