【问题标题】:What does the "ng-reflect-*" attribute do in Angular2/4?Angular2/4 中的“ng-reflect-*”属性有什么作用?
【发布时间】:2017-09-09 21:43:07
【问题描述】:

我在 Angular4 应用程序中有一个复杂的数据结构。

它是一个在节点和链接上都使用字典参数化的有向多重图。我的 Angular 组件正在处理这个复杂的数据模型。

在 Angular2.4 中,一切正常。自从我们切换到 Angular4 后,我把它放到了我的 DOM 中:

<g flareNode="" ng-reflect-model="{'id':'an-id-of-my-object'">

...由以下模板 sn-p 生成:

<svg:g flareNode [model]="item"></svg:g>

注意,model 在这里只是我组件的一个数据成员。它没有(...应该没有)特定的 Angular2 含义。它是我的应用背后复杂数据结构的一部分。

我的第一印象是 Angular序列化组件类的 model 数据成员,获取它的前 30 个字符,然后将这个完全没用的东西放入 DOM!

我说的对吗? DOM 中的整个 ng-reflect-model 是什么,它在 Angular4 中有什么具体用途,而在 Angular2 中没有?

【问题讨论】:

  • 注意:这不是一个调试问题,我在这里提供的信息还远远不够。问题的焦点,ng-reflect-model 属性的用途,也许是什么可能是这种奇怪行为的原因(将对象的前 30 个字符作为属性值放入 DOM)。任何解释 ng-reflect-model 在 Angular 框架内的作用的答案都是可以接受的。
  • 我看不到 ng-reflect 属性添加到我的组件中,但它们是在 2.4 中添加的。如果你用带有这些属性的 DOM 创建一个 plunker,我来看看
  • @Maximus 是的,在我的例子中 ng-reflect- 存在于 4.0 中,但它不在 2 中。创建一个 plunker 将是不切实际的(它是一个大的、强烈依赖的代码,提取一个一小部分是不可行的)。无论如何,我在这里想要的不是调试帮助,而是更好地理解这个 ng-reflect 东西的用途,而且我真的看得很清楚,角度组件在其序列化模型变量的前 30 个字符上表现不同.
  • 我并不是要你为你的整个应用程序创建一个 plunker,只是一个使用 ng-reflect 的组件的演示。恕我直言,stackoverflow 上没有人现在可以回答这个问题。我很高兴进行一些调试并找到答案,就像I write in-depth articles,但我需要一个演示。我今天花了一个小时想出一个例子,但无法添加 ng-reflect
  • @Maximus 你的文章很深很硬核。即使作为您的答案,它也可能更有价值(这也是非常有价值的)。

标签: angular


【解决方案1】:

ng-reflect-${name} 属性被添加用于调试目的,并显示组件/指令在其类中声明的输入绑定。所以如果你的组件是这样声明的:

class AComponent {
  @Input() data;
  @Input() model;
}

生成的 html 将呈现如下:

<a-component ng-reflect-data="..." ng-reflect-model="...">
   ...
<a-component>

它们仅在使用调试模式时存在 - Angular 的默认模式。要禁用它们,请使用

import {enableProdMode} from '@angular/core';

enableProdMode();

main.ts 文件中。这些属性是this function here添加的:

function debugCheckAndUpdateNode(...): void {
  const changed = (<any>checkAndUpdateNode)(view, nodeDef, argStyle, ...givenValues);
  if (changed) {
    const values = argStyle === ArgumentType.Dynamic ? givenValues[0] : givenValues;
    if (nodeDef.flags & NodeFlags.TypeDirective) {
      const bindingValues: {[key: string]: string} = {};
      for (let i = 0; i < nodeDef.bindings.length; i++) {
        const binding = nodeDef.bindings[i];
        const value = values[i];
        if (binding.flags & BindingFlags.TypeProperty) {
          bindingValues[normalizeDebugBindingName(binding.nonMinifiedName !)] =
              normalizeDebugBindingValue(value); <------------------
        }
      }

    ...

    for (let attr in bindingValues) {
      const value = bindingValues[attr];
      if (value != null) {
        view.renderer.setAttribute(el, attr, value); <-----------------

【讨论】:

  • @yurzui,感谢您的评论,我真的很受宠若惊。调试源代码需要时间,当我知道有人从中受益时,感觉总是很好!如果你还没有关注我on medium,请不要犹豫:)
  • @yurzui,是的,你会写吗?
  • 如果我将对象传递给输入属性,我会得到类似:ng-reflect-model="[object Object]"。如何知道它是什么对象?
  • @SharikovVladislav,它是 [object Object],因为 Angular 在一个对象上调用了 toString()。您应该通过检查输入绑定知道它是什么对象。
  • @SharikovVladislav,您可以使用ng.probe 像这样ng.probe($0).componentInstance[inputBindingProperty] 获取组件实例
猜你喜欢
  • 2016-11-11
  • 2014-07-14
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 2021-11-17
  • 2016-10-16
相关资源
最近更新 更多