Ember:动态URL中未保存的模型

时间:2013-03-03 15:49:38

标签: ember.js url-routing ember-data

我目前在我的Ember应用程序中使用FixtureAdapter,但是当我切换到RESTAdapter时,我的URL不再有效。

该应用程序是一种记分类型的东西,我希望用户能够记录所有分数,而无需连接到Web。游戏结束后,他们可以选择将所有数据保存到服务器。

现在,当Ember想要路由说,匹配/:match_id时,ID不存在,因为我没有向服务器/商店提交任何内容,所以我的模型还没有ID,我得到了网址如:/ match / null / games / null

这是预期的行为吗?如果是这样,有没有解决方法?我考虑过使用model.clientId,然后覆盖每个路由的模型钩子,尝试使用存在时使用id从商店获取Model并回退到clientId。还有其他想法吗?

更新2013年3月10日:

以下似乎符合我的需求并允许(现在)忘记在本地存储和REST适配器之间来回移动:

App.Store = DS.Store.extend({
  revision: 11,
  adapter: DS.RESTAdapter.extend({
    namespace: 'api/v1',
    bulkCommit: true,
    generateIdForRecord: function(store, record) {
      return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
        return v.toString(16);
      });
    }
  })
});

UUID功能取自:Create GUID / UUID in JavaScript?

1 个答案:

答案 0 :(得分:2)

如果还没有提交记录,那么它还不应该有id。此外,序列化查看该记录的应用程序状态的URL没有任何意义,因为该记录在提交之前不会存在于另一个浏览器中。您不能只将网址粘贴到其他位置,并将其加载到您离开的位置。

我认为您真正想做的是在未提交记录时以不同方式序列化应用程序状态(即生成不太具体的URL)。您可以通过覆盖路线中的serialize方法来实现此目的。

例如,

App.PostRoute = Ember.Route.extend({
    serialize: function(model, params) {
        if (model && model.get('isNew')) {
            // corresponds to path '/post/:post_id'
            return { post_id: 'new'}
        }

        return this._super(model, params);
    }
});

现在,如果您从控制器中调用transitionToRoute('post', post),其中post是新创建但未提交的记录,则应用程序状态将序列化为路径/post/new。如果您使用id传递一个已提交的记录,它将照常序列化。