Есть блок artboard:
modules.define(
'artboard',
['i-bem__dom'],
function (provide, BEMDOM) {
provide(BEMDOM.decl(this.name, {
onSetMod: {
js: {
inited: function () {
console.log('Init artboard');
}
}
},
_hello : function() {
console.log('hello from artboard');
}
}));
}
);
Хочу позвать его в menu-item_actions_list:
modules.define(
'menu-item',
['artboard'],
function (provide, Artboard, Item) {
provide(Item.decl({ modName : 'action', modVal : 'list' }, {
onSetMod: {
js: {
inited: function () {
this.__base.apply(this, arguments);
console.log('Init list action');
console.log(Artboard);
}
}
}
}));
}
);
А в консоли при инициализации menu-item
вижу вот что:
> Init list action
> function () {
return this.__constructor.apply(this, arguments);
}
Блок в блок зовется вроде нормально. Помогите кто знает, плиз!
А вот так пробовал?
И расскажите плиз чем конкретно код написаный @verybigman отличается от того что предложил ниже я?
Кажется что до конца не понимаю разницу.
//сс @tadatuta
@voischev в твоем варианте непонятно, модификатор какого блока декларируется.
@verybigman ты получаешь ссылку на класс блока, в консоли видишь конструктор. расскажи, какое поведение ты ожидаешь?
@tadatuta я ожидаю что могу воспользоваться методами блока. Например из примера так:
@voischev не работает
@tadatuta там вроде подправил про имя блока. или я не про то подумал и дело совсем в другом?
@voischev тоже самое. Разницы никакой. Получаю ссылку.
1) В том варианте как ты хочешь, просто так не получится, придется написать что-то типа:
2) По хорошему этот блок должен быть у тебя на странице и ты его находишь
this.findBlockInside(Outside, On)
и через инстанс блока дергаешь его методы.Хууу! Кажется мы всегда делаем по-хорошему :)))
Было бы круто, если бы он еще искался через
this.findBlockOutside('artboard')
. Потому что он странице есть, а он не находится.Тогда нужно это делать по другому, ибо
findBlockOutside
возник временно и никак не удалится, но рано или поздно это произойдет. Есть несколько вариантов общаться между блоками в "разных" мирах. 1) Один из низ -events__channels
лежит в bem-core 2) Делать манипуляции из общего родителя@tavriaforever Спасибо! Я пошел по 2. Сделал блок
app
, замиксовал его к page и в нем инициализируюartboard
. Самartboard
провайдит только методы доступа. Пашет, но что-то меня смущает:)Да норм! Постоянно так делаем :₽
Ахахаха))) Я так сто раз делал, не очкуй) Ок)
Судя по обсуждению, вы путаете методы класса и методы инстанса:
Поясню на примере. Есть некий блок
blah
, который умеет определять свои координаты с помощью методаgetPos()
. Очевидно, что у разныхblah
на странице будут разные координаты. Соответственно, методgetPos()
должен быть методом инстанса. И позвать его у класса черезmodules.require(['bla'], function(Bla) { Bla.getPost(); })
либоBEM.blocks.bla.getPos();
будет невозможно. Нужно явно найти конкретный экземпляр блока в DOM-дереве и вызывать метод этого экземпляра:findBlockInside('bla').getPost()
либо$('.bla').bem('bla').getPos();
При этом, скажем, метод
getName()
для любого блокаbla
всегда должен возвращать строкуbla
, а метод getTwoPlusTwo() — всегда число 4, результат выполнения этих методов не меняется в зависимости от того, на каком конкретно из блоковbla
они вызываются, поэтому их можно объявить в статических методах.Вообще про все это более умными словами есть в референсе.
@tadatuta мы не то чтобы путаем. Просто есть блоки, которые представлены могут быть только один раз на странице и мне хотелось иметь доступ к инстансу без поиска. Тем более, что этот поиск не всегда корректно работает. А решение с поиском из родителя мне кажется странным, но работает.
@verybigman ты же понимаешь, что это какой-то очень частный случай. сегодня такой блок только один, завтра понадобится добавить еще один. а если метод в принципе не зависит от конкретного инстанса, то и объявляй его как статический. ну а если прямо очень хочется, то можно написать что-то вроде
И потом
Только эта пепяка сломается как только появится второй
blah
на странице.@tadatuta учишь плохому)))
Блок родитель-обвязка отлично работает )