在这里,我在 Angular4 应用程序中有一个复杂的数据结构。
它是一个在节点和链接上都使用字典参数化的有向多重图。我的角度组件正在处理这个复杂的数据模型。
在 Angular2.4 中,一切正常。自从我们切换到 Angular4 后,我将它放入了我的 DOM:
<g flareNode="" ng-reflect-model="{'id':'an-id-of-my-object'">
...这是从以下模板片段生成的:
<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,我会看看
ng-reflect
的组件的演示。恕我直言,stackoverflow 上没有人现在可以回答这个问题。我有兴趣进行一些调试并找到答案,如 I write in-depth articles,但我需要一个演示。我今天花了一个小时试图提出一个示例,但无法添加 ng-reflect
。
添加 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); <-----------------
ng-reflect-model="[object Object]"
。如何获得知识它是什么对象?[object Object]
,因为 Angular 在对象上调用toString()
。您应该通过检查输入绑定知道它是什么对象。ng.probe
获取组件的实例ng.probe($0).componentInstance[inputBindingProperty]