Полимер: Императивно установленное свойство не изменяется

Я застрял уже как два дня, и я стреляю холостыми в эту проблему, которую собираюсь описать.

Я сделал плункер: http://plnkr.co/edit/OrUiqcFfb70VFtO06sNT

Итак, у меня есть <main-element> — этот элемент содержит двух дочерних элементов: <child-element> и <sub-main>. Оба этих элемента привязываются к объекту owner, установленному в <main-element>. Как это:

<child-element owner="{{owner}}"></child-element>

Теперь <sub-main> содержит еще один элемент — <sub-child-element>.

<template>
    <sub-child-element id="sub"></sub-child-element>
</template>

Но он императивно связывает свойство owner:

attached: function() {
    this.$.sub.owner = this.owner;
}

Как вы могли догадаться, <sub-child-elements> не видит изменений, внесенных в объект owner. Я пробовал разбрызгивать this.set и this.notifyPath повсюду, но это не помогло.

Есть ли способ заставить это работать? Возможно ли вообще делать то, что я хочу?


person user1463822    schedule 27.08.2015    source источник


Ответы (1)


Вы могли наблюдать owner в sub-main вот так.

observers: [
  'ownerChanged(owner.*)'
],

И всякий раз, когда он изменится, сообщите об этом sub-child-element.

  ownerChanged: function(event){
   this.$.sub.notifyPath(event.path, event.value);
  }

Вот форк вашего плункера, который делает это.

Обновить

Вы также можете наблюдать определенный путь, например owner.details.location. Просто обратите внимание, что аргументом обработчика будет новое значение. Для глубокого наблюдения (например, owner.*) обработчик получает в качестве аргументов запись об изменении. Итак, в вашем примере вы можете сделать это следующим образом.

observers: [
    'ownerChanged(owner.details.location)'
],

ownerChanged: function(newValue){
    this.$.sub.notifyPath("owner.details.location", newValue);
}
person Maria    schedule 27.08.2015
comment
Не могли бы вы объяснить, почему owner.* работает, а owner.details.location нет? - person user1463822; 27.08.2015
comment
Это будет работать, если вы адаптируете обработчик. Посмотрите на мой обновленный ответ. - person Maria; 27.08.2015