3

我有一个看起来像这样的链接

index.html#/calendar/year/month

这就是我设置路线的方式:

App.Router.map(function() {
    this.resource('calendar', {path: 'calendar/:currentYear/:currentMonth'});
});

App.CalendarRoute = Ember.Route.extend({
  model: function (params) {
    var obj = {
       weeks: calendar.getDaysInMonth(params.currentMonth, params.currentYear),
       currentMonth: params.currentMonth,
       currentYear: params.currentYear
    };
    return obj;
  },
  setUpController: function(controller, model) {
      controller.set('content', model);
  }
});

我可以这样做:

var currentMonth = this.get('content.currentMonth');
var nextMonth = parseInt(currentMonth)+1;
var route = '#/calendar/'
var year = this.get('content.currentYear');
window.location.href= route + year + '/' + nextMonth;

但我想改用路由器。

我试过了:

var router = this.get('target');
router.transitionTo('#calendar/'+year + '/' + nextMonth);

但我得到这个错误:

未捕获的错误:断言失败:找不到路由#calendar/2013/5

我也试过:

var router = this.get('target');
router.transitionTo('calendar/'+year + '/' + nextMonth);

但这也给了我一个错误:

未捕获的错误:断言失败:找不到路由 calendar/2013/5

编辑:在上面显示我的路由

4

2 回答 2

5

与我在评论中所说的相反,这实际上可以在不需要嵌套路由的情况下使用Route#serialize.

我用类似于你描述的场景制作了这个小提琴这里是演示):

在应用程序中,我存储月份和年份参数

window.App = Ember.Application.create({
    title: 'Cool App',
    calendar: { 
        month: new Date().getMonth()+1, 
        year: new Date().getFullYear() 
    }
});

定义路线

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

在日历路由中,我添加了serialize将属性转换obj为应用程序的方法,然后我连接了第 3 方库setupController以获取days属性并设置其内容。

App.CalendarRoute = Em.Route.extend({
    activate: function() {
        $(document).attr('title','Events')
    },
    serialize: function(obj) {
        return {
            year: obj.year, month: obj.month
        }
    },
    setupController: function(controller, model) {
        var obj = {
            days: calendar.getDaysInMonth(model.month, model.year),
            year: model.year,
            month: model.month
        };
        controller.set('content', obj);
    }
});

在 Handlebars 中,使用{{linkTo}}助手,我将类中calendar定义的属性App作为参数传递:

{{#linkTo calendar App.calendar tagName="li"}}
    <a {{bindAttr href="view.href"}}>
        Calendar
    </a>
{{/linkTo}}

这将生成一个链接到~/#/calendar/2013/4

于 2013-04-11T00:45:51.853 回答
0

路由器不仅仅是一个 url 管理器。它管理整个应用程序的状态。为了充分帮助您,最好查看更多代码。您是否创建了路线?您是否只是想访问 ember 应用程序无法处理的“网址”?

this.transistionTo(routeName)据我所知,预计会收到一条命名路线。然后它将为该路由生成正确的 url。如果您还没有设置任何路线,那么我认为您无法使用它。

于 2013-04-10T12:51:44.930 回答