2014-12-09 3 views
5

Пробегая через сайт the starter tutorial на сайте EmberJS, некоторые вещи меня немного смущают.Модели, именования, и это

Одно замечание заключается в том, что я решил использовать ember 1.9.0beta4 с рулями 2.0.0 вместо 1.8.1/1.3.0, включенными в стартовый пакет.

Сначала код, включенный в скринкаст:

app.js 

App.Router.map(function() { 
    this.resource('about'); 
    this.resource('posts'); 
    this.resource('post', {path: ':post_id'}) 
}); 

App.PostsRoute = Ember.Route.extend({ 
    model: function() { 
    return posts; 
    } 
}); 

и

index.html 

{{#each model}} 
    <tr><td> 
    {{#link-to 'post' this}} 
     {{title}} <small class='muted'>by {{author.name}}</small> 
    {{/link-to}} 
    </td></tr> 
{{/each}} 

Это работает точно так же, как и ожидалось, и запрашиваемый сообщение появляется при нажатии.

Однако, поскольку я использую 1.9.0, предыдущий код выдает устаревшее предупреждение для {{#each}}, в котором мне следует вместо этого использовать {{#each foo in bar}}. Я понимаю, почему это появляется и соглашается, что многословие помогает точно показать, какие данные зацикливаются.

Так что я изменить линию {{#each model}} к {{#each post in model}} и каждый бит данных исчезает ... тогда я пытаюсь изменить код:

updated index.html 

{{#each post in model}} 
    <tr><td> 
    {{#link-to 'post' this}} 
     {{post.title}} <small class='muted'>by {{post.author.name}}</small> 
    {{/link-to}} 
    </td></tr> 
{{/each}} 

Отлично! Название и имя автора снова появляются для каждого сообщения. Но нажатие любой из сообщений дает мне неопределенный id. Я меняю {{#link-to 'post' this}} на {{#link-to 'post' this.id}}. Тот же результат. Я меняю его на {{#link-to 'post' post.id}}. id теперь включен, но когда я нажимаю на ссылку, я получаю эту ошибку:

Error while processing route: post Assertion Failed: You used the dynamic segment 
post_id in your route post, but App.Post did not exist and you did not override 
your route's `model` hook. 

Мои вопросы:

  1. Что происходит внутри, что заставляет префикс post. если я просто включить post in код? Для меня я должен иметь возможность использовать либо this, либо не нуждаться ни в каких префиксах.

  2. После добавления post in к каждому заявлению, что происходит с this? Почему он больше не относится к одному и тому же объекту?

  3. Как можно назвать модели, чтобы упростить классификацию? post in model действительно должно быть post in posts, но я не нашел способ назвать контейнер данных.

  4. Что вызывает ошибку теперь, когда я больше не отношусь к модели как this? Как его можно исправить?

ответ

1

Ваше разочарование и вопросы именно по этой причине первый синтаксис нежелателен и только each post in ... форма будет поддерживаться. Надеюсь, это ответит на ваши вопросы и, пожалуйста, ответьте, если вам нужно разъяснение.

  1. В первом примере, где используется each model, объем блока изменений в пост, а это означает this относится к текущему сообщению в петле. Когда вы получаете форму each post in ..., область действия не изменяется.Когда он не изменяется, это означает, что this действительно ссылается на предыдущую область (до цикла). В вашем примере предыдущей областью является контроллер массива, а не объект post.

  2. Это связано с вопросом 1. С форматом each post in ..., this относится к тому, что это было за пределами each блока. Дело не в том, что что-то происходит с this, это что-то делает не происходит с this, потому что область действия не меняется.

  3. Для лучшего наименовании я обычно настроить свойство в качестве псевдонима для содержания в контроллере массива:

    posts: Ember.computed.alias('content')

  4. В оригинальном примере, когда Вы поставляете link-to помощника с this, вы» re передавая полный объект сообщения. Из того, что вы уже пробовали, похоже, это одна вещь, которую вы не делали:

    {#link-to 'post' post}}

+0

Я думаю, что вы вместе с @KalmanHazins прояснили все отлично. Благодаря! –

1

Я постараюсь ответить на ваши вопросы в порядке:

  1. Когда вы говорите {{#each model}}, вы зацикливаете сообщения (массивы) в модели, поэтому каждый раз через цикл this ссылается на текущий пост. Поэтому, когда вы говорите {{title}} вы действительно говорят {{this.title}} Когда вы более откровенными не говоря {{#each post in model}} то каждая итерация цикла больше не обращаясь к this и вместо этого относится к переменной, которую вы сделали под названием post

  2. Как упоминалось в # 1 выше, this больше не относится к каждой отдельной итерации. Я понимаю, как вы думаете, что, возможно, все еще можно использовать this (рядом с post) было бы удобно, но подумайте о следующем сценарии. Что происходит, когда у вас есть вложенный {{#each}}? Будет ли неявный this ссылаться на внешний массив или внутренний массив? Если вы действительно не чувствуете, как вводить дополнительные post. вы всегда можете использовать помощник {{#with post}} Рулей, что SCOPES post назад this Смотрите следующий пример here

  3. Если у вас есть собственность в вашей модели или контроллере, вы можете абсолютно цикл по этому свойству, как в {{#each color in colors}} См here для рабочего примера

  4. И наконец, должно быть link-to{{#link-to 'post' post}}

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