Angular 角度2@输入获取';太多了

Angular 角度2@输入获取';太多了,angular,Angular,我使用Angular 2和一些getter和setter在组件之间进行通信。我遇到的问题是getter和setter函数运行了很多次,即使它们不依赖于任何东西。我做错什么了吗 对于getter函数,我只有以下代码: private get SomeData(): string { console.log("Getter called"); return "some string"; } 设置器代码为: @Input() public set SomeData

我使用Angular 2和一些getter和setter在组件之间进行通信。我遇到的问题是getter和setter函数运行了很多次,即使它们不依赖于任何东西。我做错什么了吗

对于getter函数,我只有以下代码:

 private get SomeData(): string {
        console.log("Getter called");
        return "some string";
 }
设置器代码为:

@Input()
public set SomeData(newData: string) {
    console.log("Setter called");
}
绑定为:

<child-comp [SomeData]="SomeData"></child-comp>


控制台显示Getter调用,Setter调用,然后打印大约20行Getter调用。为什么称这些为?

问题是由

private get SomeData(): string {
    console.log("Getter called");
    return "some string";
}
因为每次更改检测检查值是否已更改时,它都会返回一个新的字符串实例

如果您将代码更改为

private someData:string = "some string";
private get SomeData(): string {
    console.log("Getter called");
    return this.someData;
}

然后每次都会返回相同的字符串实例,Angular将其识别为未更改,并且不会调用setter,除非
someData
已更改。

这也适用于大多数/所有情况。这当然是一个简单的示例,绑定到setter中的局部变量也显示了相同的行为。但是在我的示例中,setter只被调用一次,所以这不会改变getter不断被调用的事实。我应该完全避免getter中复杂的逻辑吗?您应该明确避免getter中复杂的ligic和视图中绑定的方法。我使用getter声明的布尔值执行与第二个示例相同的操作,然后由getter返回。它也经常被调用。想知道是否还有其他问题可以让getter启动更改检测?有几种方法可以降低更改检测频率,如使用
ChangeDetectionStrategy.OnPush
ChangeDetectorRef.detach()
,但最重要的是getter不做实际工作(CPU密集型)但是只返回一个值,那么经常调用它就无关紧要了。“some string”==“some string”,angular每次如何判断它是一个“新字符串实例”?