1

我尝试在我的项目中学习和使用 Backbone/Marionette。现在我坚持使用路由器导航,它不像我应该的那样工作。

class MyApp.Router extends Marionette.AppRouter
    appRoutes :
        'info/:place/(:what)' : 'places_page'

MyApp.Controller = ->
    places_page: (place,what)->
        console.log 'Triggered places_page'


MyApp.addInitializer( ->
    controller = new MyApp.Controller()
    new MyApp.Router
        controller: controller
    Backbone.history.start( pushState: false )
    )


MyApp.vent.on('do:search', ->
    console.log 'triggered do:search'
    place = 'Moscow'
    what = 'Пицца'
    info_model.set place: place, item:what
    new_url = 'info/'+where+'/'+what
    if new_url != decodeURIComponent(Backbone.history.fragment)
        Backbone.history.navigate(new_url, {trigger: false})

在 site.com/#info/Budapest/Vine 页面的初始加载或重新加载时,我会收到Triggered places_page预期的消息。

但是,当我触发do:search将 url 更新为 site.com/#info/Moscow/Пицца 的事件时,我又得到Triggered places_page了!所以它从头开始重新加载我的所有视图,而不是仅仅更改 url 并重新渲染一个模型。

我可以在这里做错什么?

更新2: 发现奇怪的东西。如果我在新网址中使用拉丁字母,一切都会正常工作。但是如果我在新的 url 路径中使用西里尔文,它将触发路由功能。

主干:1.0,木偶:v1.0.3,jquery:1.9.1

4

3 回答 3

4

谜团已揭开!

发生这种情况是因为 url 中的非拉丁符号。正确代码:

new_url = 'info/'+encodeURIComponent(where)+'/'+encodeURIComponent(what)
if new_url != Backbone.history.fragment
    Backbone.history.navigate(new_url, {trigger: false})

navigate因为如果 url 没有改变并且默认为 false, Backboune.navigate 不会执行trigger,所以我可以这样简单地编写它:

new_url = 'info/'+encodeURIComponent(where)+'/'+encodeURIComponent(what)
Backbone.history.navigate(new_url)
于 2013-06-12T09:56:51.503 回答
0

Backbone.history开始时接受一个对象。在 CoffeeScript 中试试这个语法:

Backbone.history.start
  pushState: false

另外,pushState默认为false,所以你可以只拥有Backbone.history.start()

这能解决您的问题吗?

于 2013-06-12T07:12:08.150 回答
0

需要正确的 URL 编码。我在与路由器功能相关的 Backbone 文档中找不到这个。

我有同样的问题,可惜查询部分有空格,即:

#app/terms?filter=java ee

连同您的回答中描述的 encodeURIComponent 解决方案,我还在主干.js(1.0.0)中找到了以下与导航功能有关的注释行:

// Save a fragment into the hash history, or replace the URL state if the
// 'replace' option is passed. You are responsible for properly URL-encoding
// the fragment in advance.
于 2013-06-27T15:48:35.760 回答