Как наследовать стили для расширенного вручную полимерного элемента?

Я хотел бы создать новый элемент Polymer, который расширяет собственный элемент HTML (скажем, div), поэтому я мог бы использовать <div is="my-div">, но наследовал бы поведение от другого элемента Polymer (my-list). Я добился этого:

<polymer-element name="my-list">
    <template>
        <style>
            :host {
                background-color: #EEE;
                display: block;
                border: 1px solid black;
            }
        </style>
        <content></content>
    </template>
    <script>
        Polymer('my-list', {
            color: "red",
            ready: function() {
                console.info("my-list is ready!");
                this.children[0].style.color = this.color;
            }
        });
    </script>
</polymer-element>
<polymer-element name="my-div" extends="div">
    <script>
        (function() {
            var myListProto = Polymer.getRegisteredPrototype("my-list");
            var myDivProto = Polymer.extend({}, myListProto);
            myDivProto.color = "blue";
            Polymer('my-div', myDivProto);
        }());
    </script>
</polymer-element>

Работающий jsFiddle находится здесь.

Проблема в том, что my-list стили не применимы к my-div.

Есть ли способ унаследовать их? Или я должен сделать такое расширение каким-то другим способом?


person tomalec    schedule 04.02.2014    source источник


Ответы (2)


Мне кажется, что то, что вы здесь делаете, - это техника миксина. У вас есть два класса, которые не находятся в одной цепочке наследования, и вы хотите использовать общий API.

Вы сделали часть миксина для прототипа, и вы можете сделать это и для шаблона, но есть разные детали.

Вот JsBin, показывающий, как я это сделаю: http://jsbin.com/vuru/1/edit< /а>

Я сформулировал это более прямо как проблему примесей, что облегчило мне работу.

Ключевая информация, которую я использовал:

  • Если вы определяете registerCallback() в своем прототипе Polymer, он вызывается во время регистрации с прототипом как this и ссылкой на <polymer-element> в качестве аргумента.

  • вы можете переопределить fetchTemplate, чтобы настроить выбор шаблона

  • Если вы не установите шаблон в <polymer-element> до registerCallback() времени, вам придется вручную вызывать механизм полифилла CSS shadow-dom (этот бит: Platform.ShadowCSS.shimStyling(...)).

person Scott Miles    schedule 05.02.2014
comment
Спасибо! :) Я попытаюсь еще немного поиграть с вашим примером, так как моя идея заключалась в том, что my-list не должен выставлять какие-либо глобальные переменные и т. д., поскольку он должен быть отдельным элементом, совершенно не подозревающим о my-div. В общем, я пытаюсь сделать <my-list> автономным элементом, но я хотел бы иметь возможность применять его поведение к другим нативным элементам (div, ul, ol,...). - person tomalec; 08.02.2014
comment
О, да, еще одно: это правда, что я не смог заставить «мой список» не знать, как вы планируете его использовать. Между прочим, это из-за того, что полифилы должны делать для расширения CSS, и когда-нибудь в будущем вы, вероятно, сможете избежать этой проблемы. - person Scott Miles; 09.02.2014

Не совсем то, что вам нужно, но core-style позволяет вам определить стиль, который вы можете легко включить в свои шаблоны. Затем, когда вы расширяете элемент, обязательно включите тот же основной стиль в свой дочерний шаблон.

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

В любом случае, core-style позволяет довольно легко передавать стили. см. здесь https://pascalprecht.github.io/2014/08/01/sharing-styles-across-web-components-with-polymer-and-core-style/

person Thomas Luechtefeld    schedule 18.02.2015