Как применить Highlight.js к новым представлениям, используя Ember.js?

Я пытаюсь использовать highlight.js для подсветки синтаксиса, но могу заставить его работать только при первой загрузке.

HTML:

<script type="text/x-handlebars" id="post">
 {{#if html}}
   {{rawhtml html}}
 {{else}}
   {{#each section}}
   {{rawhtml this}}
   {{/each}}
 {{/if}}
</script>

Используя didInsertElement, я могу запустить его только один раз.

App.PostView = Ember.View.extend({
  didInsertElement: function () {
    hljs.initHighlightingOnLoad();
  }
});

ДЕМО: http://jsbin.com/iKUrUWO/4 Перейдите в раздел " Код", а затем "Лучшие практики CSS". Обновите ваш браузер. Появится подсветка синтаксиса (розовая и фиолетовая). Перейдите к "Названию файлов" и обратно. Теперь код вернулся к белому.

JSBIN: http://jsbin.com/iKUrUWO/4/edit?html,js

Примечание. Я попытался использовать блочную форму помощника {{each}}, но безуспешно.

<script type="text/x-handlebars" id="post">
 {{each controller postViewClass="App.PostView"}}
</script>

App.PostView = Ember.View.extend({
  template: Ember.Handlebars.compile('{{#if html}}{{rawhtml html}}{{else}}{{#each section}}{{rawhtml this}}{{/each}}{{/if}}'),
    didInsertElement: function () {
      hljs.initHighlighting();
    }
  });

И почему-то не может использовать this.$().hljs.initHighlighting();,

Я начинаю путаться, поэтому любая помощь будет оценена! Спасибо!

2 ответа

Я думаю, что для этого вы хотите использовать вычисляемое свойство. Просто определите функцию, которая возвращает правильное значение с расширением.property в вашем классе "Post":

htmlContent: function() {
    var html= this.get('html');
    if (blah blah blah) {
        // do what you need to do to return the new content
    }
    return newValueToDisplay;
}.property('html')

Затем просто поместите это в свой шаблон: {{{htmlContent}}}

Вы говорите, что не можете использовать this.$().hljs.initHighlighting();но ты не говоришь почему? Сообщение в консоли?

Я думаю, что проблема в том, что ember-код не очень хорошо сочетается с кодом стиля jquery plugin. Похоже, что в highlight.js есть синхронные функции, которые просто берут некоторый код и отмечают его правильной подсветкой. hljs.highlightAuto('code')

Я бы попытался создать помощник для выделения руля, который обрабатывает текст с помощью функции hljs:
{{highlight model.html}}

Другие вопросы по тегам