Text.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { directive } from "../../../model/Directive";
  2. import { maybeEvaluateLater } from "../../../model/Evaluator";
  3. import { effect } from "../../../model/Reactivity";
  4. import { PupperNode } from "../Node";
  5. /**
  6. * @directive x-text
  7. * @description Sets an element inner text.
  8. *
  9. * @todo When a buffered text is given, no text is displayed.
  10. * Maybe the HTML to VDom is treating buffered text incorrectly.
  11. */
  12. directive("text", async (node, { expression, scope }) => {
  13. const evaluate = maybeEvaluateLater(expression);
  14. let replacedNode: PupperNode = null;
  15. await effect(async () => {
  16. try {
  17. const text = await evaluate(scope) as string;
  18. if (!text) {
  19. console.warn(`pupper.js evaluated x-text expression "${expression}" as`, undefined);
  20. return;
  21. }
  22. if (replacedNode) {
  23. replacedNode = replacedNode.replaceWith(
  24. new PupperNode(text, node, node.renderer)
  25. )[0];
  26. } else {
  27. replacedNode = new PupperNode(text, node, node.renderer);
  28. node.appendChild(replacedNode);
  29. node.removeAttribute("x-text");
  30. }
  31. node.setDirty();
  32. } catch(e) {
  33. console.warn("[pupperjs] failed to set inner text:");
  34. console.error(e);
  35. }
  36. });
  37. });