2013-04-10 124 views
3

我有一个链接,看起来像这样灰烬路由器:如何使用transitionTo

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); 

但我得到这个错误:

Uncaught Error: assertion failed: The route #calendar/2013/5 was not found

我也试过:

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

但是,这也给了我一个错误:

Uncaught Error: assertion failed: The route calendar/2013/5 was not found

编辑:显示我上面的路由

+1

嗯,在''router.transitionTo('#calendar /'+ year +'/'+ nextMonth);'你在#之后缺少一个“/”。我不知道还有什么可能是错误的,但我通常使用'this.transitionToRoute('example.name');'或'App.Router.router.transitionTo('example.name');''。 – 2013-04-10 12:43:48

+0

听起来不错,所以我只是试过:router.transitionTo('#/ calendar /'+ year +'/'+ nextMonth);但后来我得到未捕获的错误:断言失败:没有找到路线#/ calendar/2013/5 – redconservatory 2013-04-10 12:52:15

+1

@redconservatory我相信这个问题与您的路线定义有关。这可能应该是一个嵌套路线,其中一个分段为一年,另一个分段为一个月份。此外,他目前正在做的方式似乎在该路线中缺少'model'方法中的'params'参数。 – MilkyWayJoe 2013-04-10 13:36:20

回答

4

从我在评论中所说的内容来看,这实际上可以在不需要嵌套路线的情况下使用Route#serialize来完成。

我已经类似于你所描述的情景做出this fiddledemo here):

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

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中的属性到应用程序,然后我连接到第三方库在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); 
    } 
}); 

在车把,使用{{linkTo}}帮手,我路过我App类中定义为参数的calendar属性:

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

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

+0

谢谢!这实际上是比实际文档更完整的解释。真的有帮助。 – redconservatory 2013-04-15 13:54:53

+0

我感到你的痛苦。文档有一些差距,但我相信它会很快好起来的。如果你想帮助,你应该访问[网站回购](https://github.com/emberjs/website/issues)。有很多事情要做:) – MilkyWayJoe 2013-04-15 14:04:07

0

路由器不仅仅是一个url管理器。它管理整个应用程序的状态。为了充分帮助你,最好能看到更多的代码。你创建了路线吗?你只是想去一个'网址',而不是由呃应用程序处理?

this.transistionTo(routeName)预计会收到一条我知道的命名路线。它会为该路线生成正确的网址。如果你还没有设置任何路线,那么我认为你不能使用它。

+0

在上面添加了我的路由代码 - 谢谢。 – redconservatory 2013-04-10 12:55:55

+0

so'router.transitionTo('calendar',2013,5)'不起作用? – 2013-04-10 13:12:41

+0

这给了我“未捕获更多的对象通过比动态段” – redconservatory 2013-04-15 17:04:11