【问题标题】:Use of serialize hook in ember routes在 ember 路由中使用序列化钩子
【发布时间】:2014-01-28 10:06:41
【问题描述】:

ember路由类中serialize hook有什么用?

       App.PostRoute = Ember.Route.extend({
        model: function(params) {
            return this.store.find('post', params.post_id);
        },

        serialize: function(post) {
            return { post_id: post.get('id') };
        }
    });

Ember 文档说:

如果您的动态段以 _id 结尾,则默认模型挂钩会将第一部分转换为应用程序命名空间上的模型类(post 变为 App.Post)。然后它将使用动态段的值对该类调用 find 。 默认的序列化钩子将使用模型对象的 id 属性拉动动态段。

但我无法理解路由类中序列化钩子的使用

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    serialize 方法确定使用什么作为所提供实体的参数。

    示例。

    假设您有以下用户模型,具有以下属性。

    id
    username
    email
    

    现在,如果您有一个用户列表,并且想要链接到显示用户详细信息页面,则可以使用这样的循环。

    {{#each users}}
      {{#link-to user.show this }} {{username}} {{/link-to}}
    {{/each}}
    

    所以当 Ember 看到这个链接到帮助器时,我会将它转换为一个链接,它可能看起来像这样

    <a href="/user/1">elvar</a>
    

    现在这里的默认行为是使用 id 作为参数,这是您自己的示例显示的,我从模型中选择 id。我们可以使用序列化器方法来改变它。

    假设我们不想使用 id,而是使用用户名作为参数。

    App.UserShowRoute= Ember.Route.extend({
        model: function(params) {
            return this.store.find('user', params.user);
        },
    
        serialize: function(user) {
            return { user: user.get('username') };
        }
    });
    

    现在链接到帮助器将产生以下内容。

     <a href="/user/elvar">elvar</a>
    

    【讨论】:

    • 我同意你的看法。但是,如果我们从您的 UserShowRoute 中删除 serialize 钩子,它仍然可以工作。那么为什么我们需要在路由类中使用序列化钩子。
    • 你没有,它默认为模型 ID。如果你想使用它,你只需要实现它,比如一个 slug,这对我来说通常是一个用例。
    • 您的“每个”循环是否在单独的用户路由中?所以你只需要序列化用户路由(你链接的那个),而不是用户路由(你链接的地方)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多