1

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

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

现在,当 Ember 想要路由到 match/:match_id 时,ID 不存在,因为我没有向服务器/存储提交任何内容,所以我的模型还没有 ID,我得到的 URL 如下: /match/null/游戏/null

这是预期的行为吗?如果是这样,是否有解决方法?我考虑过使用model.clientId,然后为每个路由覆盖模型钩子,以尝试在存在时使用id从商店中获取模型并回退到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 函数取自:在 JavaScript 中创建 GUID/UUID?

4

1 回答 1

2

如果一条记录还没有提交,那么它应该还id没有。此外,序列化查看该记录的应用程序状态的 url 没有任何意义,因为该记录在提交之前不会存在于另一个浏览器中。您不能只是将 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,它将像往常一样被序列化。

于 2013-03-03T19:41:02.237 回答