Привязка данных между одноуровневыми элементами в шаблоне Polymer dom-bind

У меня есть шаблон <dom-bind>, содержащий два элемента: один — кнопка, другой — список. Когда список загружается (его свойство loading равно true), свойство кнопок active должно быть установлено в false, и наоборот.

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

Это мой шаблон <dom-bind>:

<dom-bind id="messageListScreen">
    <template>
        <paper-progress-button on-click="fetchNewMessages" active="[[!loading]]" active-text="Refresh" inactive-text="Refreshing..." raised></paper-progress-button>
        <message-grid id="grid" loading="{{loading}}"></message-grid>
    </template>
</dom-bind>

С приведенным выше кодом ничего не происходит. Если я сделаю это

<script>
    document.addEventListener("WebComponentsReady", function(event){
        let self = document.getElementById('messageListScreen');
        self.loading = self.$.grid.loading;
    });
</script>

self.loading действительно получает значение grid.loading, но когда значение grid.loading изменяется, значение self.loading остается прежним.

Есть ли способ привязать значение grid.loading к свойству active <paper-progress-button> с помощью <dom-bind>?


person Magnus W    schedule 23.01.2018    source источник
comment
Попробуйте инициализировать свойство загрузки (например, document.querySelector('messageListScreen').loading) вне слушателя WebComponentsReady. Это единственная деталь, в которой ваш пример явно отличается от примера в официальной документации (polymer-project.org/2.0/docs/devguide/templates#dom-bind).   -  person craPkit    schedule 23.01.2018
comment
@craPkit Все еще, кажется, не работает ... Я просматривал этот пример официальной документации раньше, но их привязка данных - только один способ, поскольку он устанавливается только один раз, а затем никогда не изменяется. Помните, я борюсь с двусторонней привязкой.   -  person Magnus W    schedule 23.01.2018


Ответы (1)


Вы должны использовать двустороннюю привязку.

В свойствах loading в message-grid добавить notify:true, а в message-grid установить загрузку через this.set('loading', false) (вместо this.loading = false).

У вас также должно быть свойство с именем loading в messageListScreen. У вас, вероятно, есть, вам это не нужно, но это хорошо для документации.


Другое дело, что логические атрибуты всегда истинны, если они присутствуют, поэтому загрузка всегда будет истинна в обоих случаях, независимо от того, какие значения имеет атрибут (true||false). Вместо этого переключите логическое значение на число (int), где 1 — истина, а 0 — ложь.

person Rickard Elimää    schedule 23.01.2018
comment
Отлично, notify: true сделал свое дело! Не уверен, что вы имеете в виду, что логические атрибуты всегда истинны, если они присутствуют? Я инициализирую загрузку false в объявлении свойств, а затем она устанавливается <iron-ajax>... - person Magnus W; 23.01.2018
comment
Булевы значения устанавливаются в тегах как ‹tag booleanname›, поэтому, если booleanname присутствует, это устанавливает логическое значение в true. Если он отсутствует, он устанавливает его в false. - person Asher; 29.10.2018