我不确定如何将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:无法读取属性'规范化'未定义的。
答案 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
所以我我需要时可以参考“真实”这个。
这会解决您的问题吗?