#jquery #meteor #meteor-blaze
#jquery #meteor #meteor-blaze
Вопрос:
Как мне выполнить нижеприведенное с помощью Meteor Blaze и / или почему это не сработает?
Код делает / не делает то, что написано ниже
// client...
$(document).ready(function () {
console.log("this logs...");
$('a.external').each(function () {
console.log("this doesn't log");
$(this).attr('title', 'External Link');
});
});
Ответ №1:
В Meteor вам нужно быть осторожным, чтобы манипулировать вашим DOM после его рисования. Приведенный выше код сработает, когда все скрипты будут загружены, но DOM еще не был нарисован.
К счастью, это очень просто!
Если ваш шаблон такой
<template name="hello">
<a href="https://servicelocale.com/" class="external">Link</a>
</template>
Затем вы можете использовать выполненный обратный вызов:
Template.hello.rendered = function() {
this.$('a.external').each(function () {
$(this).attr('title', 'External Link');
});
}
Я также использовал this.$
вместо $
в отображаемом обратном вызове. Это полезно, потому что он просматривается только в hello
шаблоне, а не повсюду. Таким образом, вы можете иметь <a class="external"
на своей странице, но в другом шаблоне, и у него не будет добавлен атрибут title.
Вы также можете использовать $
вместо этого здесь.
Комментарии:
1. Хорошо, я полагаю, что мы пробовали это без
this.$
, но попробуем еще раз…2. Круто, что это работает с шаблоном, отличным от layout , что означает, что нам придется написать несколько функций для наших различных шаблонов, которым это нужно. Если у кого-нибудь еще есть какие-либо мысли о том, почему это не будет работать для шаблона макета, пожалуйста, дайте мне знать!
3. @JohnAllen Шаблон макета вызывается через,
UI.body
поэтому вы можете использоватьUI.body.rendered
согласно странице документации здесь ( docs.meteor.com/#ui_body )