2015-04-25 1 views
0

Вот довольно стандартный способ установить маршрут в железном маршрутизаторе:Зачем мне нужно называть динамический маршрут «: _id» и не все, что я хочу?

Router.route('/posts/:_id', { 
    name: 'postPage', 
    data: function() { return Posts.findOne({_id: this.params._id}) } 
}); 

Экспериментировать вокруг немного, новичка, как я, я попробовал:

Router.route('/posts/:whatever', { 
    name: 'postPage', 
    data: function() { return Posts.findOne({_id: this.params.whatever}) } 
}); 

Это хорошо работает, вплоть до точки , Правда, whatever будет зачерпывать все, что после /posts/ в качестве значения, и контекст данных действительно будет таким же, как раньше ... но привязка к конкретным сообщениям теперь не будет работать!

Так,

<a href="{{pathFor 'postPage'}}">{{title}}</a> 

просто не будет работать, делая это "мой" способ (ссылки на вообще ничего).

Я не могу полностью обернуть голову вокруг этого, и я слишком много начинаю, чтобы понять исходный код для Iron Router, поэтому я надеюсь, что кто-то здесь может объяснить это так, что даже новичок как я могу понять.

Предпочтительно нравится что-то вроде этого:

  1. Первый {{pathFor 'postPage'}} выглядит внутри маршрутов, чтобы найти один названный postPage.

  2. Он видит, что этот маршрут соответствует /posts/, а затем что-то еще.

  3. Заглядывая в контекст данных, он обнаруживает, что возвращается только одно сообщение, а именно то же самое с _id, как и все, что приходит после /posts/.

  4. Он понимает, что он должен ссылаться на это сообщение, умело устанавливая URL-адрес на /posts/_id.

Это неправильно, скорее всего, и это не объясняет, почему она будет работать, когда whatever превращается в _id. Но это очень помогло бы мне увидеть, как он разбирается подобным образом.

Редактировать: Очистить мой вопрос, чтобы его было легче понять.

+0

Похоже, что Meteor установил соглашение о названии свойства '_id', которое, по-видимому, не может быть переопределено. См. Http://en.wikipedia.org/wiki/Convention_over_configuration –

ответ

1

Там простой набор обстоятельств, которые в совокупности приводят к путанице:

  1. Вопрос Posts.findOne объясняется тем, что первый аргумент может быть либо селектор или документ _id. Так что это не ярлык, а скорее documented feature.
  2. Как вы узнали, помещение :something в URL-адрес утюга: маршрутизатор заставляет это значение указывать как this.params.something внутри функции маршрута. Это также регистрирует something как параметр этого маршрута, который приводит нас к тому, как работает pathFor.
  3. Помощник pathFor принимает два входа: сначала имя маршрута (в данном случае 'postPage') и второй объект параметров, которые могут исходить либо от второго аргумента, как в {{pathFor 'postPage' params}} или из контекста данных следующим образом: {{#with params}}{{pathFor 'postPage'}}{{/with}}.

Теперь, вот почему переходящая в документ из базы данных работает, если вы звоните параметр _id, но если вы не называть его whatever: почтовый объект, который извлекается из базы данных _HAS в _id поле, но он оленья кожа» t имеет поле whatever. Поэтому, когда вы передаете его в pathFor, он проходит только по правильному _id, если параметр на маршрут также называется _id.

Сообщите мне, если это имеет смысл, я согласен с тем, что это несколько запутывает и что этот «ярлык» скрывает то, что именно pathFor и params действительно делают.

+0

Спасибо! Это хорошее объяснение, но это помогает мне добраться до половины, к сожалению! Я очистил свой вопрос, поэтому, пожалуйста, если хотите, посмотрите на изменения и как я хотел бы объяснить это. Даже если вы не хотите отформатировать свой ответ так, возможно, это может помочь вам понять, как я думаю о проблеме. – Yeats

 Смежные вопросы

  • Нет связанных вопросов^_^