У меня есть привязка к строке с разрывом строки, например 'Hello\nWorld'
в моей модели. Теперь я хочу отобразить значение в своем шаблоне, используя {{x}}
. Но разрыв строки отображается неправильно. Обеспечивает ли полимер какую-либо поддержку вывода <br>
для разрывов строк?
Связать текст с разрывами строк
Ответы (1)
Прямо сейчас лучшим вариантом будет создать файл Nl2br
PolymerElement
. Единственное место, где вы можете добавить разметку, находится внутри шаблона, поэтому вам понадобится шаблон, чтобы разделить строку и добавить <br />
s
Пример:
<nl2br-element text="{{}}"></nl2br-element>
nl2br.dart
library nl2br;
import "dart:html";
import 'package:polymer/polymer.dart';
import "package:polymer_expressions/polymer_expressions.dart";
@CustomTag('nl2br-element')
class Nl2brElement extends PolymerElement with ObservableMixin {
@observable String text;
DocumentFragment instanceTemplate(Element template) =>
template.createInstance(this,
new PolymerExpressions(globals: {
'splitnewline': (String input) => input.split("\n")
}));
}
nl2br.html
<polymer-element name="nl2br-element" attributes="text">
<template>
<template repeat="{{line in text | splitnewline}}">
{{line}}<br />
</template>
</template>
<script type="application/dart" src="nl2br.dart"></script>
</polymer-element>
nl2br_test.html
<!DOCTYPE html>
<html>
<head>
<link rel="import" href="nl2br.html">
<script src="packages/polymer/boot.js"></script>
</head>
<body>
<template id="nl2br" bind>
<nl2br-element text="{{}}"></nl2br-element>
</template>
<script type="application/dart" src="nl2br_test.dart"></script>
</body>
</html>
nl2br_test.dart
library nl2br_test;
import 'dart:html';
main() {
query("#nl2br").model = "foo\nbar";
}
Вы можете создать полимерное выражение, которое заменит \n
на <br />
. Прямо сейчас полимер очищает весь html, и вы не можете обойти его без манипуляций с DOM. Так как это сделает <br />
html безопасным, foo\nbar
будет отображаться точно так же, как foo<br />bar
на странице без разрыва строки. Это означает, что это не будет делать именно то, что вы хотите, но если полимер добавит способ отображения безопасного html на странице, это будет то, что вам нужно.
library nl2br_mixin;
import "dart:html";
import "package:polymer_expressions/polymer_expressions.dart";
class Nl2brMixin {
DocumentFragment instanceTemplate(Element template) =>
template.createInstance(this,
new PolymerExpressions(globals: {
'nl2br': (String input) => input.replaceAll("\n", "<br />")
}));
}
Вы можете использовать этот миксин с вашим PolymerElement
class CustomElement extends PolymerElement with ObservableMixin, Nl2brMixin {
@observable
String text = "foo\nbar";
}
И используйте выражение nl2br в своем шаблоне
{{text | nl2br}}
Теперь это, вероятно, не лучший способ получить выражение nl2br
в вашем пользовательском элементе, не помещая его явно в ваш класс. Если у вас есть несколько миксинов, которые объявляют instanceTemplate
или объявляют его в вашем классе, только один из них будет работать.