Попытка добавить элемент Polymer в другой элемент Polymer

У меня есть полимер v-fire:

<script>
    Polymer({
        is: 'v-fire',

        properties : {
            onFire: {
                type : String,
                reflectToAttribute: true
            }
        },

        firing: function () {
            this.fire('fire');
        }
    })
</script>

Я хочу иметь возможность использовать его в любом месте моих полимерных элементов, чтобы они запускали внутреннюю функцию, чтобы заставить их выполнять определенную задачу, например обновление, чтобы они все обновлялись, когда v-fire вызывает firing.

Например, я создаю новый объект для тестирования:

<script>
    Polymer({
        is: 'fire-tester',

        _updateContent: function () {
            alert('I get updated');
        }
    });
</script>

в index.html

…
<link rel="import" href="/components/fire-tester/fire-tester.html">
…
<body>
<fire-tester id="fire-tester"></fire-tester>
<script>
(function () {

    var ft = document.getElementById('fire-tester');

    // make a global v-fire Polymer
    var vfire = document.createElement('v-fire');
    // custom callback of the Polymer's that will include the v-fire
    vfire.onFire = '_updateContent';

    /**
     * And here, I try to insert the v-fire in the fire-tester Polymer
     */
    Polymer.dom(ft.root).insertBefore(
        vfire,
        Polymer.dom(ft.root).childNodes[0]
    );

    // the dom is pretty neat, fire-tester contains v-fire with the custom on-fire callback

    // then I try to fire the event
    vfire.firing(); // but nothing happen


});
</script>

Это не работает, потому что я считаю, что v-fire не обрабатывается при вставке в fire-tester. Есть ли способ заставить Polymer обрабатывать фрагмент dom, как если бы он был объявлен в локальной модели DOM?


person vdegenne    schedule 05.06.2015    source источник


Ответы (1)


Похоже, вы неправильно подходите к системе событий. Что вы хотите, так это запустить метод для fire-tester, когда он обнаружит событие fire в дочернем элементе v-fire, верно? Вот как бы я это собрал:

v-fire.html

<script>
  Polymer({
    is: 'v-fire',

    firing: function() {
      this.fire('fire');
    }
  });
</script>

fire-tester.html

<script>
    Polymer({
      is: 'fire-tester',

      listeners: {
        'fire': '_updateContent'
      },

      _updateContent: function () {
        alert('I get updated');
      }
    });
</script>

index.html

<fire-tester id="fire-tester"></fire-tester>
<script>
  (function(){
    var ft = document.getElementById('fire-tester');

    var vfire = document.createElement('v-fire');

    Polymer.dom(ft.root).insertBefore(
        vfire,
        Polymer.dom(ft.root).childNodes[0]
    );

    vfire.firing();
  })();
</script>
person Zikes    schedule 05.06.2015
comment
отлично! однако я понял, что не могу вставить v-fire в другие элементы Polymer, а не клонировать его, что привело к тому, что я зациклился на всех клонированных v-fire, чтобы запустить пользовательское событие во всем моем приложении. Я думаю, что есть другой и лучший подход к управлению событиями в приложении. Я соберу конкретных слушателей приложения в корневом элементе и выполню соответствующие функции Polymer в качестве ответа. спасибо за вашу поддержку в любом случае, это помогло мне лучше видеть arrrr! - person vdegenne; 05.06.2015
comment
Я действительно думаю, что было бы лучше использовать поведение, если бы вы продолжали повторно использовать одни и те же события для разных элементов. - person Neil John Ramal; 05.06.2015
comment
Трудно сказать, не видя всего проекта, но, возможно, было бы более уместно сначала включить v-fire в шаблон fire-tester или вставить его как содержимое. Взгляните на элемент <content> и его использование на polymer- project.org/1.0/docs/devguide/local-dom.html - person Zikes; 05.06.2015