使用ember-data 2.0和emberjs 2.0.1路由错误

时间:2015-09-02 14:27:28

标签: ember.js ember-data ember-cli

来自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

我已阅读这些帖子:#272#261

JSON响应有问题吗?

谢谢。我一直在使用ember-data很长一段时间,在切换到ember 2.0.1和ember-data 2.0.0之前从未遇到过这个错误

编辑:我现在确定它与嵌入式对话有关,因为在ember检查器中,如果我试图查看用户的对话(并且会话被加载到商店中),它会返回一个promiseArray,它不是&# 39;解决了。

2 个答案:

答案 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约定而不是反对框架。它会为你节省很多精力和紧张。