【问题标题】:Ember tagless component innerhtmlEmber 无标签组件 innerhtml
【发布时间】:2018-10-11 05:37:05
【问题描述】:

我在 Ember 中有一个无标签组件,并希望在生命周期挂钩(例如 didRender)上有 innerHtml (this.element)。当我使用this.element 时,该值始终为null。当我向组件添加标记名 (tagName: 'div') 时,我拥有带有 this.element 的组件的 innerHtml,但是我可以在不设置 tagName 的情况下获得 innerHtml 吗?

【问题讨论】:

  • 我不确定,但我认为这是无标签组件的价格。为什么需要一个无标签组件?也许还有另一种方法可以实现相同的目标

标签: javascript ember.js components


【解决方案1】:

this.element 不给你innerHTML,它给你一个真正的HTML Element。根据定义,无标签组件没有任何自己的Element。所以this.element 必然为空。

我们没有添加用于检索Range 的等效属性(这是您表示 DOM 的无标记组件区域所需的)的最大原因是,与this.element 不同,Range 可以在组件的整个生命周期中发生变化。让它完全可观察会很昂贵,而让它不可观察会很容易产生错误。

Gaurav 的建议涵盖了大多数常见用例:明确标记您真正想要查找的元素并通过querySelectorquerySelectorAll 访问它们。

如果您正在做一些非常奇特的事情,并且您知道它只是一个可能会过时的快照,那么逃生舱口是Ember.ViewUtils.getViewBounds。它没有标记为 public,但它依赖于像 Ember Inspector 这样的官方项目,所以我们绝对不会在没有警告的情况下破坏它。与任何频繁使用的非公共 API 一样,我们会发出弃用警告并等待一个完整的 LTS 周期。

Ember.ViewUtils.getViewBounds 的情况下,可以将其标记为公开,如果有人为此编写 RFC,我认为我们可以就此达成共识。

【讨论】:

    【解决方案2】:

    是的,这个坏了。详情请见https://github.com/emberjs/ember.js/issues/13627

    已在此处发布了一种解决方法:https://github.com/emberjs/rfcs/issues/168 但是,它使用私有 api,并且可能会在未来的版本中中断而不会发出警告。

    我的建议是通过 tagName 使用一个元素,这样this.element 存在,或者在组件的父元素上放置一个类,以便您可以使用document.querySelector('.class-name').innerHTML——但这需要知道父元素。

    【讨论】:

    • 那个问题是关于elementId,而不是element,尽管我认为在这两种情况下,要求this.element 的无标签组件真的没有意义——那里没有元素可以返回给你。
    猜你喜欢
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2019-06-04
    • 2020-03-20
    • 2018-01-02
    相关资源
    最近更新 更多