【问题标题】:Ember: unsaved models in dynamic URLsEmber:动态 URL 中未保存的模型
【发布时间】:2013-02-17 16:55:53
【问题描述】:

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

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

现在,当 Ember 想要路由到 match/:match_id 时,ID 不存在,因为我没有向服务器/存储提交任何内容,所以我的模型还没有 ID,我得到了像这样的 URL:/match/null/games/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 函数取自:Create GUID / UUID in JavaScript?

【问题讨论】:

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


    【解决方案1】:

    如果一条记录尚未提交,那么它不应该有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 传递一条已提交记录,它将照常进行序列化。

    【讨论】:

    • 感谢您的反馈!你说的很有道理。但这是否意味着如果你使用 localStorage,你就不能拥有唯一的 URL。能够使用 localstorage 在应用程序上为某些内容添加书签是有意义的。
    • 确实如此;我所说的仅适用于RESTAdapter。我不熟悉localStorage,但我会调查一下。
    • 我想了更多,我想这是关于本地或非持久数据是否应该有 URL 的理论辩论。我认为它应该,因为在创建对象时(不一定持久)它确实存在,因此可以导航到。因此,只要数据在那里,输入它的 URL 就应该显示它。 Back 和 Fwd 按钮也应该可以工作。如果刷新浏览器,再次输入 URL,会得到 404,其实是有道理的:“resource not found”。我认为 UUID 在这里真的可以提供帮助。
    • 这是一个非常有趣的问题。您可能想以这种方式打开一个新问题。
    • 我在这里发布了一个新问题:stackoverflow.com/questions/15326308/… 现在的解决方案是将新数据持久保存在本地存储中,这样就可以保存和导航分数,而不必每次都去服务器分数。第 2 步是在用户准备好时刷新本地存储并在服务器上持久化内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2016-11-09
    • 2017-08-20
    相关资源
    最近更新 更多