Проверка полимера на наличие точек вставки
Я начинаю изучать Polymer 1.0 и не могу понять, как программно искать точки вставки. Я понимаю, что мог бы обернуть <div>
вокруг тега <content>
и проверить, есть ли у этого <div>
дети или нет, но это требует рендеринга <div>
для каждого элемента, что кажется расточительным. Есть ли способ с помощью JavaScript проверить, были ли загружены какие-либо точки вставки? В идеале, у меня была бы функция thereAreInsertionPoints
, которая определяла бы, будет ли отображаться тег <p>
. Мой полимерный код выглядит так:
<template>
<h1>{{title}}</h1>
<p>{{body}}</p>
<content id="content"></content>
<p if="{{thereAreInsertionPoints()}}">There are insertion points!</p>
</template>
<script>
Polymer({
is: "post-content",
properties: {
title: String,
body: String
},
thereAreInsertionPoints: function(){
//determine whether or not we have insertion points
}
});
</script>
1 ответ:
Существуют различные полимерные API для работы с DOM, включая Content API.
Эти API можно использовать различными способами для проверки распределенных узлов и точек вставки. Я создал рабочую реализацию, которая показываетAPI Содержимого:
Полимер.дом(contentElement).getDistributedNodes()
Полимер.узел DOM).getDestinationInsertionPoints()
post-content
элемент с дополнительными методами для проверки распределенных узлов и конечных точек вставки.
<script src="http://www.polymer-project.org/1.0/samples/components/webcomponentsjs/webcomponents-lite.js"></script> <link rel="import" href="http://www.polymer-project.org/1.0/samples/components/polymer/polymer.html"> <dom-module id="post-content"> <template> <h1>{{title}}</h1> <p>{{body}}</p> <content></content> <template is="dom-if" if="{{destinationInsertionPointsExist()}}"> <p>Destination insertion point(s) exist.</p> </template> <template is="dom-if" if="{{distributedNodesExist()}}"> <p>Distributed node(s) exist.</p> </template> </template> <script> Polymer({ is: "post-content", properties: { title: String, body: String }, destinationInsertionPointsExist: function () { var distributedNodes = Polymer.dom(this).childNodes; var countDestinationInsertionPoints = 0; distributedNodes.forEach(function (distributedNode) { var distributedNodeHasDestinationInsertionPoints = Polymer.dom(distributedNode).getDestinationInsertionPoints().length > 0 ? true : false; if (distributedNodeHasDestinationInsertionPoints) { countDestinationInsertionPoints++; } }); return countDestinationInsertionPoints > 0 ? true : false; }, distributedNodesExist: function () { var contentNodes = Polymer.dom(this.root).querySelectorAll("content"); var countDistributedNodes = 0; contentNodes.forEach(function(contentNode) { var contentNodehasDistributedNodes = Polymer.dom(contentNode).getDistributedNodes().length > 0 ? true : false; if (contentNodehasDistributedNodes) { countDistributedNodes++; } }); return countDistributedNodes > 0 ? true : false; } }); </script> </dom-module> <post-content title="This is the title" body="This is the body"> <p>This is distributed content</p> </post-content>
Несколько замечаний о коде:
Я сделал много имен переменных и троичных проверок очень многословными для ясности в этом ответе. Можно было бы внести изменения для упрощения кода.
Например:
var distributedNodeHasDestinationInsertionPoints = Polymer.dom(distributedNode).getDestinationInsertionPoints().length > 0 ? true : false;
Может стать чем-то вроде
var hasInsertionPoints = Polymer.dom(distributedNode).getDestinationInsertionPoints().length
Использовать новый (полимер 1.0)
dom-if
условный шаблон.
<p if="{{thereAreInsertionPoints()}}">There are insertion points!</p>
Становится
<template is="dom-if" if="{{destinationInsertionPointsExist()}}"> <p>Destination insertion point(s) exist.</p> </template>
Я бы рекомендовал пройти через методы
destinationInsertionPointsExist
иdistributedNodesExist
, чтобы убедиться, что вы полностью понимаете, что на самом деле проверяется. Возможно, Вам потребуется изменить эти методы в соответствии с вашими конкретными потребностями и требованиями.
Например, даже если между тегами start и end элемента
post-content
имеется один пробел, оба эти метода вернутся истинный.
<post-content title="This is the title" body="This is the body"> </post-content>