Ошибка при составлении привязки: необработанный отказ от обещания TypeError: невозможно прочитать свойство «маршрутизатор» нулевого значения

Перед последним обновлением фреймворка aurelia я мог заменить

<nav-bar router.bind="router"></nav-bar>

с

<compose view-model="./nav-bar" model.bind="router"></compose>

в app.html скелетной навигации

Это больше не работает. Необработанный отказ от обещания TypeError: не удается прочитать свойство «маршрутизатор» с нулевым значением

На самом деле, ни одна из моих композиций не работает с обновленной аурелией. Есть ли проблема с композицией на данный момент?


person Erikas Pliauksta    schedule 24.08.2015    source источник


Ответы (2)


Панель навигации имеет свойство router, украшенное декоратором @bindable. Невозможно связать свойство маршрутизатора пользовательского элемента панели навигации со свойством маршрутизатора модели представления приложения с помощью компоновки.

Как правило, compose и @bindable не связаны друг с другом. Это никак не перевести:

<my-custom-element my-bindable-property.bind="foo"></my-custom-element>

К этому:

<!-- no way to bind "my-bindable-property"... binding to "model" is not going to help -->
<compose view-model="./my-custom-element"></compose>

Попробуйте изменить композицию на это:

<compose view="./nav-bar.html"></compose>

Вы также можете удалить nav-bar.js — он не будет использоваться.

person Jeremy Danyow    schedule 25.08.2015
comment
Спасибо, что нашли время ответить на мой вопрос. Согласно документации Aurelia это возможно: ‹template repeat.for=item of items› ‹compose model.bind=item view-model=widgets/${item.type}› ‹/compose› ‹/template› - person Erikas Pliauksta; 25.08.2015
comment
Больше нельзя связывать объекты с композицией? - person Erikas Pliauksta; 25.08.2015
comment
спасибо за указание на то, что compose и bindable не следует использовать вместе. - person Erikas Pliauksta; 25.08.2015

Чтобы передать объекты в compose пользовательский элемент, мне пришлось установить такой элемент:

<compose view-model="./nav-bar" model.bind="router"></compose>

а затем используйте метод activate для назначения этого объекта в модели:

export class NavBar {
  activate(router){
    this.router = router;
  }
}

Как заметил Джереми, compose и @bindable больше не работают вместе...

person Erikas Pliauksta    schedule 25.08.2015
comment
ты пробовал <compose view="./nav-bar.html"></compose> ? Тогда вам вообще не понадобится nav-bar.js - person Jeremy Danyow; 25.08.2015
comment
да, это тоже работает. Я понимаю, что в этом случае настраиваемый элемент компоновки использует модель представления родителя. - person Erikas Pliauksta; 25.08.2015