CANJS3 несколько экземпляров компонента
С CanJS (3) я пытаюсь вставить дважды один и тот же компонент, но с другим поведением. "Родительский" сташ выглядит так:
<div class="container-fluid contents">
<...>
<my-component someParameters="value1"></my-component>
</...>
<...>
<my-component someParameters="value2"></my-component>
</...>
</div>
Благодаря привязке к потомку, параметр получает в дочернем viewModel, который является простым DefineMap.
Дочерний компонент прост:
export default Component.extend({
tag: 'my-component',
viewModel: myviewmodel (a DefinedMap, with a can-connect attribute, and some others attributes),
view: view (some stache file),
events: {
'inserted': function(el) {
console.log('inserted my-component...');
},
}
});
Пока все хорошо, я добиваюсь, чтобы оба были в одном окне, и при отображении пользовательских параметров это показывает разницу.
Но потом пришли неприятности. Оба дочерних компонента имеют соединение (в viewmodel), и я ожидаю, что затем подключиться к тому же IP, но подписаться на другой канал.
Похоже, что CanJS не создает две разные модели представления в фактах, поэтому я получаю один и тот же экземпляр моего объекта can-connect, что делает работу невозможной...
Если у кого-то есть идея, как разместить два компонента на одной странице, но с двумя разными областями действия, я буду рад прочитать.
РЕДАКТИРОВАТЬ: реальная проблема заключается в неуникальности "модели" (т.е. объект viewmodel.connect)
1 ответ
Решение:
Объект can-connect должен быть в замыкании:
var behaviors = function() {return connect([
someBehavior,
anotherBehavior
],
{
url: {
getListData: "GET myURL"
}
})
};
И DefineMap должен быть таким:
var MyMap = DefineMap.extend({
connection: {value: behaviors},
parameters: ...
}
Некоторое интересное чтение: значение атрибута документа