【问题标题】:Is resource nesting the only way to enable multiple dynamic segments?资源嵌套是启用多个动态段的唯一方法吗?
【发布时间】:2013-02-16 09:17:55
【问题描述】:

这似乎表明答案是肯定的:

From Ember Pre1 to Pre4: Multiple dynamic segments per route? Update: What is the allowed syntax for dynamic segments?

...但我只是想确认一下。

就我而言,作为一项学习练习,我正在 Ember 中构建一个带有月度显示的日历。我需要能够从给定月份链接到上个月和下个月。

所以我希望能够

{{ linkTo calendar_month year month }}

this.transitionTo('calendarMonth', year, month)

想知道在不使用嵌套资源的情况下这是否可行。我可以让它与类似的东西一起工作:

App.Router.map(function() {
  this.resource("year", { path: "calendar/:year" }, function() {
    this.resource("calendar_month", { path: "/:month" }, function() {
      this.route('index');
    });
  });
});

...但这涉及到引入一个 Year 对象,从建模的角度来看,它可能并不真正需要存在,这样我就可以在 linkTo 中使用它的 id

我更喜欢用两个参数/动态段设置路线:

App.Router.map(function() {
  this.route('calendar_month', { path: 'calendar/:year/:month'});
});

但是我说这不可能吗?我只是想确保我以最干净、最简洁的方式来做这件事。

换一种说法:

我理解“如果你的用户界面是嵌套的,那么你的路由应该是嵌套的”这个概念,但是,如果我的 url 是嵌套的,这并不一定意味着我的界面也会嵌套。所以我想知道:如果我的 url 是嵌套的,构建相应的嵌套模型是否总是最佳实践?

非常感谢任何指导/澄清。

谢谢,

【问题讨论】:

    标签: ember.js ember-router


    【解决方案1】:

    因为我是您所引用问题的提问者,所以我在这里回答。我已经更新了我的问题,这是完全可能的。

    你的方法应该有效:

    App.Router.map(function() {
      this.route('calendar_month', { path: 'calendar/:year/:month'});
    });
    

    您只需要添加序列化和模型挂钩实现:

    serialize: function(context){
        // i assume that you wrap year and month in an Object (maybe App.YearAndMonthObject)
        var ret = {
            year : context.get("year"),
            month : context.get("month")
        };
        return ret;
    },
    model : function(params){
        //somehow create your object from the params
        var model = App.YearAndMonthObject.create({
            year : params.year,
            month : params.month
        });
        return model;
    }
    

    这也需要修改您对 linkTo 的使用:

    {{ linkTo calendar_month year month }}
    

    ...相反,您只需使用:

    {{ linkTo calendar_month yearAndMonth }}
    

    我认为这是处理这个问题的一种修饰方式。

    总结:那么路线到底是什么?

    它们用于分离关注点。在您的情况下,年份和月份似乎是同一个问题的一部分(=路线)。因此它们应该被包装在一个新的 Ember 对象中,并且您的路线 (CalendarMonthRoute) 应该处理这个新对象(可能是 YearAndMonthObject 或 CalendarMonthObject?)。

    【讨论】:

    • 在本例中,serialize()model() 方法是否存在于 calendar_month.js 中?
    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多