来自discuss.ember的交叉发布。我使用Ember 2.0.1和Ember-data 2.0并默认使用ember-cli生成的默认RESTSerializer。我知道这个问题之前已被问到很多地方(没有真正的答案),但还没有解决方案对我有用。
我有一个用户模型的模型钩子:
export default Ember.Route.extend({
model() {
return this.store.findAll('user');
}
});
路由器如下:
Router.map(function() {
this.route('users', { path: '/' }, function() {
this.route('user', { path: '/:user_id' }, function(){
this.route('conversations', { path: '/'}, function(){
this.route('conversation', { path: '/:conversation_id' });
});
});
});
});
例如,转到/ conversations / 4转换为users.user.conversations。我的关系在我的模型中定义。在用户模型中,我有一个DS.hasMany('会话')会话属性集{{embedded:' always' }。返回的JSON如下所示:
{"conversations":[
{
"id":183,
"status":"opened",
"readStatus":"read",
"timeAgoElement":"2015-08-20T16:58:20.000-04:00",
"createdAt":"June 16th, 2015 20:00",
"user":
{
"id":4
}
}
]}
我得到的问题是Ember-data能够将我的数据添加到商店但我收到此错误:
Passing classes to store methods has been removed. Please pass a dasherized string instead of undefined
JSON响应有问题吗?
谢谢。我一直在使用ember-data很长一段时间,在切换到ember 2.0.1和ember-data 2.0.0之前从未遇到过这个错误
编辑:我现在确定它与嵌入式对话有关,因为在ember检查器中,如果我试图查看用户的对话(并且会话被加载到商店中),它会返回一个promiseArray,它不是&# 39;解决了。
答案 0 :(得分:0)
您的对话路线有网址/:user_id/:conversation_id
。如果您希望它为/:user_id/conversations/:conversation_id
,则应将this.route('conversations', { path: '/'}, function(){
更改为this.route('conversations', function(){
或this.route('conversations', { path: '/conversations'}, function(){
答案 1 :(得分:0)
尽量不要将对象直接存储起来。 .push()的可能用例:
例如,想象一下我们想要将一些数据预先加载到商店中 该应用程序首次启动。
否则createRecord和访问父模型的属性会自动将对象加载到商店。
在你的情况下,来自后端的UserController应该返回JSON:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if textField == phoneNumberTextField{
var newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)
var components = newString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)
var decimalString = "".join(components) as NSString
var length = decimalString.length
var hasLeadingOne = length > 0 && decimalString.characterAtIndex(0) == (1 as unichar)
if length == 0 || (length > 11 && !hasLeadingOne) || length > 12{
var newLength = (textField.text as NSString).length + (string as NSString).length - range.length as Int
return (newLength > 11) ? false : true
}
var index = 0 as Int
var formattedString = NSMutableString()
if hasLeadingOne{
formattedString.appendString("1 ")
index += 1
}
if (length - index) > 1{
var zeroNumber = decimalString.substringWithRange(NSMakeRange(index, 1))
formattedString.appendFormat("%@ ", zeroNumber)
index += 1
}
if (length - index) > 3{
var areaCode = decimalString.substringWithRange(NSMakeRange(index, 3))
formattedString.appendFormat("(%@) ", areaCode)
index += 3
}
if (length - index) > 3{
var prefix = decimalString.substringWithRange(NSMakeRange(index, 3))
formattedString.appendFormat("%@ ", prefix)
index += 3
}
if (length - index) > 3{
var prefix = decimalString.substringWithRange(NSMakeRange(index, 2))
formattedString.appendFormat("%@ ", prefix)
index += 2
}
var remainder = decimalString.substringFromIndex(index)
formattedString.appendString(remainder)
textField.text = formattedString as String
return false
}else{
return true
}
}
Ember的谈话路线可能如下:
{"users" : [ {"id":1,"conversations":[183,184]} ]}
用户模型:
export default Ember.Route.extend({
model: function(params) {
return this.store.find('conversation', params.conversation_id);
}
}
您不必总是完全重新加载模型或将子记录添加到商店。例如,您可以向用户模型添加新会话:
export default DS.Model.extend({
conversations: DS.hasMany('conversation', {async: true})
});
P.S。尝试遵循Ember约定而不是反对框架。它会为你节省很多精力和紧张。