Ember得不到某些属性 [英] Ember get not getting certain attribute
问题描述
在Google Chrome上的 UserController
中运行以下内容时,使用 ember-couchdb-kit-0.9
,Ember数据 v1.0.0-beta.3-56-g8367aa5
,Ember v1.0.0
和
更新
一个非常混乱的更新!
当我从另一个函数保存模型时:
saveModel:function(){
this.get('model')save()然后(
function ,textStatus,jqXHR){
console.log('Saved successfully。');
},
函数(jqXHR,textStatus,errorThrown){
console.log(jqXHR) ;
console.log(errorThrown);
console.log(textStatus);
}
);
}
模型已正确保存。 serializeBelongsto
中的所有内容都与预期的一致。
这是一个不同的粘贴表,显示了这种情况的输出: http://pastebin.com/Vawur8Q0
我想出了这个问题。基本上, serializeBelongsTo
中的 belongsTo
对象在被引用时并没有真正解决,我发现查询已完成
。所以我通过保存方式实现:
函数saveOn(target,attribute){
target.addObserver(attribute ,function(){
if(target.get(attribute)){
console.log(Inside with%@。fmt(attribute));
target.removeObserver(attribute) ;
Ember.run.once(target,function(){
target.save();
});
}
});
};
customerSignUp:function(){
var model = this.get('model');
var customer = this.get('store')。createRecord('customer',{
description:'Why hello sir'
});
customer.save()然后(function(){
model.set('customer',customer);
customer.set('user',model);
saveOn(customer,'user.isFulfilled');
saveOn(model,'customer.isFulfilled');
});
}
现在一切都像一个魅力。对于 serializeBelongsTo
可能是一个好主意。这行: console.log(Ember.get(belongsTo,'isFulfilled'));
正在出现 false
我的情况。在创建记录和序列化之间只有一种竞争条件!
我想让我的 saveOn
函数返回一个承诺,然后我可以用它来连接多个 saveOn
。这样我就不需要执行一个 customer.save()
来确保id的填充。
When running the following from the UserController
on Google Chrome, with ember-couchdb-kit-0.9
, Ember Data v1.0.0-beta.3-56-g8367aa5
, Ember v1.0.0
, and this couchdb adapter:
customerSignUp: function () {
var model = this.get('model');
var customer = this.get('store').createRecord('customer', {
description: 'Why hello sir',
user: model
});
customer.save().then(function() {
model.set('customer', customer);
model.save();
});
}
with these models:
App.User = App.Person.extend({
name: DS.attr('string'),
customer: DS.belongsTo('customer', {async: true })
App.Customer = DS.Model.extend({
user: DS.belongsTo('user', {async: true}),
description: DS.attr('string')
});
neither the user nor the customer has their relationship set properly (in the Ember Debugger the user has null
and the customer has <computed>
, rather than some sort of <EmberPromiseObject>
which is what they have when it works).
This only happens when the object in question is persisted. If the save()
calls are omitted, both have correctly set relationships, but of course the database hasn't been updated with this information. Whenever the saves happen, the relationships are overwritten with empty entries.
I found that the problem was in the adapter's serializeBelongsTo
function, which I've now changed my copy to the following:
serializeBelongsTo: function(record, json, relationship) {
console.log("serializeBelongsTo");
console.log(record.get('user'));
console.log(json);
console.log(relationship);
var attribute, belongsTo, key;
attribute = relationship.options.attribute || "id";
console.log(attribute);
key = relationship.key;
console.log(key);
belongsTo = Ember.get(record, key);
console.log(belongsTo);
if (Ember.isNone(belongsTo)) {
return;
}
json[key] = Ember.get(belongsTo, attribute);
console.log(Ember.get(belongsTo, attribute));
console.log(json);
if (relationship.options.polymorphic) {
return json[key + "_type"] = belongsTo.constructor.typeKey;
}
else {
return json;
}
}
attribute
, belongsTo
, and key
all log as correct, but
console.log(Ember.get(belongsTo, attribute));
returns undefined
,
which I've tried to change to
console.log(Ember.get(Ember.get(belongsTo, 'content'), attribute));
since console.log(belongsTo);
told me the id
attribute was hidden inside a content
object. Attached is a screenshot showing what I mean.
The change doesn't fix the problem though, and I keep getting undefined
. No matter what method I use to try to get the id out of the belongsTo
object, I always get either null
or undefined
. Here are some examples of things I've tried to get content
out of the object:
var content = belongsTo.content;
var content = Ember.get(belongsTo, 'content');
var content = belongsTo.get('content');
console.log(json);
returns Object {description: "Why hello sir", user: undefined}
Here's a pastebin showing relevant output: http://pastebin.com/v4mb3PJ2
Update
A very confusing update!
When I save the model from a different function:
saveModel: function() {
this.get('model').save().then(
function( data, textStatus, jqXHR ) {
console.log('Saved successfully.');
},
function( jqXHR, textStatus, errorThrown ) {
console.log(jqXHR);
console.log(errorThrown);
console.log(textStatus);
}
);
}
The model is correctly saved. Everything in serializeBelongsto
works exactly as expected.
Here's a different pastebin showing output for this case: http://pastebin.com/Vawur8Q0
I figured out the problem. Basically the belongsTo
object in serializeBelongsTo
wasn't really resolved by the time it was being referenced, which I found out by querying isFulfilled
. So I implemented by saving side this way:
function saveOn (target, attribute) {
target.addObserver(attribute, function () {
if (target.get(attribute)) {
console.log("Inside with %@".fmt(attribute));
target.removeObserver(attribute);
Ember.run.once(target, function() {
target.save();
});
}
});
};
customerSignUp: function () {
var model = this.get('model');
var customer = this.get('store').createRecord('customer', {
description: 'Why hello sir'
});
customer.save().then(function () {
model.set('customer', customer);
customer.set('user', model);
saveOn(customer, 'user.isFulfilled');
saveOn(model, 'customer.isFulfilled');
});
}
Now everything works like a charm. It might be a good idea for serializeBelongsTo
to take this into account though. This line: console.log(Ember.get(belongsTo, 'isFulfilled'));
was coming up false
in my case. There was just a race condition of some sort between the creation of the record and it's serialization!
I'd like to make my saveOn
function return a promise though, which I could then use to chain multiple saveOn
s together. That way I wouldn't have to do a customer.save()
to make sure the id's were populated.
这篇关于Ember得不到某些属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!