Маршруты не обработаны - PullRequest
       5

Маршруты не обработаны

0 голосов
/ 16 февраля 2012

У меня есть приложение node.js (сервер) и backbone.js (клиент) - я могу загрузить и запустить свое магистральное приложение на странице ... и запустить маршрутизатор, но мой маршрут по умолчанию (". * ") не вызывается. Я могу вручную вызвать функцию индекса после инициализации маршрутизатора, но мне не нужно делать этот шаг, когда я строю магистральные приложения через рельсы.

Кто-нибудь знает, почему это происходит?

добавление кода (в coffeescript):

class NodeNetBackbone.Routers.RegistryPatients extends Backbone.Router
  routes:
    ''          : 'index'
    '.*'        : 'index'
    '/index'    : 'index'
    '/:id'      : 'show'
    '/new'      : 'new'
    '/:id/edit' : 'edit'

  initialize: ->
    console.log 'init the router'
    @registry_patients = new NodeNetBackbone.Collections.RegistryPatients()
    # TODO: Figure out why this isn't sticking...
    @registry_patients.model = NodeNetBackbone.Models.RegistryPatient
    # TODO: Try to only round trip once on initial load
    # @registry_patients.reset($('#container_data').attr('data'))
    @registry_patients.fetch()

    # TODO: SSI - why are the routes not getting processed?
    this.index()

  index: ->
    console.log 'made it to the route index'
    view = new NodeNetBackbone.Views.RegistryPatients.Index(collection: @registry_patients)
    # $('#container').html('<h1>Patients V3: (Backbone):</h1>')
    $('#container').html(view.render().el)

1 Ответ

0 голосов
/ 16 февраля 2012

Магистральные маршруты не являются регулярными выражениями (если вы не добавляете маршрут регулярного выражения вручную, используя route). Из тонкой инструкции :

Маршруты могут содержать части параметров, :param, которые соответствуют одному компоненту URL между слешами; и разделительные части *splat, которые могут соответствовать любому количеству компонентов URL.

[...] Маршрут "file/*path" будет соответствовать #file/nested/folder/file.txt, передавая "nested/folder/file.txt" действию.

И если мы проверим источник, мы увидим это :

// Backbone.Router
// -------------------
//...
// Cached regular expressions for matching named param parts and splatted
// parts of route strings.
var namedParam    = /:\w+/g;
var splatParam    = /\*\w+/g;

Таким образом, ваш '.*' маршрут должен соответствовать буквально '.*', а не «чему-либо», как вы ожидаете.

Я думаю, вы хотите что-то более похожее на это:

routes:
  ''          : 'index'
  #...
  '*path'     : 'index'

Убедитесь, что ваш маршрут *path находится на в нижней части списка маршрутов :

// Bind all defined routes to `Backbone.history`. We have to reverse the
// order of the routes here to support behavior where the most general
// routes can be defined at the bottom of the route map.

Это предположение о «порядке» элементов в объекте кажется мне довольно опасным и непродуманным, поскольку нет гарантированного порядка :

Механизм и порядок перечисления свойств (шаг 6.a в первом алгоритме, шаг 7.a во втором) не указан.

Думаю, вам лучше добавить маршрут по умолчанию *path вручную в методе initialize:

class NodeNetBackbone.Routers.RegistryPatients extends Backbone.Router
  routes:
    ''          : 'index'
    '/index'    : 'index'
    '/:id'      : 'show'
    '/new'      : 'new'
    '/:id/edit' : 'edit'

  initialize: ->
    console.log 'init the router'
    @route '*path', 'index'
    #...
...