Ember рекомендует использовать ваш контроллер для украшения вашей модели. Учитывая эту модель, мы хотим визуализировать каждую из этих публикаций в блоге, используя соответствующий механизм рендеринга:
[
{ id: 1, isMD: false, md_or_html: "<p>This is HTML.</p>" },
{ id: 2, isMD: true, md_or_html: "*This is MD.*" }
]
Вы начнете с создания маршрута, который возвращает эту модель:
App.IndexRoute = Ember.Route.extend({
model: function() {
return [
{ id: 1, isMD: false, md_or_html: "<p>This is HTML.</p>" },
{ id: 2, isMD: true, md_or_html: "*This is MD.*" }
];
}
});
Простое возвращение модели не означает, что все рендерится. Вам также необходимо убедиться, что шаблон для индексного маршрута пытается что-то поместить на страницу:
<script type="text/x-handlebars" data-template-name="index">
<ul>
{{#each}}
<li>{{output}}</li>
{{/each}}
</ul>
</script>
Вы заметите, что мы еще не создали свойство output
, хотя мы включили его в наш шаблон. Нам нужно украсить нашу модель, чтобы добавить обработанный вывод HTML или Markdown:
App.IndexController = Ember.ArrayController.extend({
itemController: 'post'
});
App.PostController = Ember.ObjectController.extend({
output: function() {
var result;
if (this.get('isMD')) {
var converter = new Markdown.Converter();
result = converter.makeHtml(this.get('md_or_html'));
} else {
result = this.get('md_or_html');
}
/*
IMPORTANT!!! Ember automatically escapes HTML upon insertion.
To actually embed the result as HTML you will need tell Ember
that the value is safe to embed as HTML.
DO NOT RETURN SafeStrings UNLESS THE VALUE IS TRUSTED AND SANITIZED!
*/
return new Handlebars.SafeString(result);
}.property('isMD', 'md_or_html')
});
Мы не можем просто добавить свойство output
к PostController
и заставить все работать без указания IndexController
на использование PostController
для каждого элемента в модели. Это достигается установкой itemController
на IndexController
(подумайте: «какой контроллер использовать для каждого элемента»). Это позволяет нам индивидуально украшать каждое сообщение в блоге свойством output
. Мы используем вычисляемое свойство, чтобы сообщить Ember, что значение output
зависит от того, является ли сообщение isMD
и тело сообщения. Если что-то изменится, мы хотим, чтобы Ember перерисовал вывод.
Полный пример включает дополнительные комментарии и подробности о том, как расширить шаблон для самоанализа в теле сообщения, чтобы определить, является ли он HTML или MD.