Angular 2,带setter 的@Input 与不带setter 的@Input 的行为是否不同?
Angular 2, Does @Input with a setter behave differently than @Input without a setter?
我想知道是否有人可以对此进行详细说明。使用 setter 的 @Input()
与不使用 setter 的 @Input()
在变化检测方面的行为是否不同?
例如:
@Input() something: SomeType;
-vs-
private _something;
@Input() set something(something: SomeType ) {
this._something = something;
}
get something(): SomeType {
return this._something;
}
明显的区别是 setter/getter 允许 @Input()
有一些额外的逻辑。但这是否会以不同的方式影响变化检测,而不是我在没有 setter 的情况下使用 @Input()
?
从 angular 的角度来看,唯一的区别是您有机会挂钩那些 @Input()
的 get/set 函数。
从 Javascripts 的角度来看,第一个将是 "just" a 属性,第二个将使用 Object.defineProperty
.
笨蛋:https://plnkr.co/edit/1koamZCvyG5YAIPNB73r?p=preview
编译代码 setter:
Object.defineProperty(AppComponent.prototype, "test1", {
get: function () { return this._test1; },
set: function (val) {
console.log('test1 was set!');
this._test1 = val;
},
enumerable: true,
configurable: true
});
__decorate([
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
__metadata('design:type', Object),
__metadata('design:paramtypes', [Object]) /* difference? */
], AppComponent.prototype, "test1", null);
带OUT的编译代码setter:
__decorate([
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
__metadata('design:type', Object)
], AppComponent.prototype, "test2", void 0);
均使用 angular-cli
编译:ng build
.
angular 变化不大。不会设置输入或不会更频繁地调用 setter。然而,需要注意的是 setter 中有更多逻辑可以触发另一个变化检测。如果有,angular 将抛出已知错误(仅在开发模式下)
Expression has changed after it was checked.
因此,变化检测器的行为并没有不同,但可能会出现问题,具体取决于您在 setter
中放置的额外逻辑
我想知道是否有人可以对此进行详细说明。使用 setter 的 @Input()
与不使用 setter 的 @Input()
在变化检测方面的行为是否不同?
例如:
@Input() something: SomeType;
-vs-
private _something;
@Input() set something(something: SomeType ) {
this._something = something;
}
get something(): SomeType {
return this._something;
}
明显的区别是 setter/getter 允许 @Input()
有一些额外的逻辑。但这是否会以不同的方式影响变化检测,而不是我在没有 setter 的情况下使用 @Input()
?
从 angular 的角度来看,唯一的区别是您有机会挂钩那些 @Input()
的 get/set 函数。
从 Javascripts 的角度来看,第一个将是 "just" a 属性,第二个将使用 Object.defineProperty
.
笨蛋:https://plnkr.co/edit/1koamZCvyG5YAIPNB73r?p=preview
编译代码 setter:
Object.defineProperty(AppComponent.prototype, "test1", {
get: function () { return this._test1; },
set: function (val) {
console.log('test1 was set!');
this._test1 = val;
},
enumerable: true,
configurable: true
});
__decorate([
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
__metadata('design:type', Object),
__metadata('design:paramtypes', [Object]) /* difference? */
], AppComponent.prototype, "test1", null);
带OUT的编译代码setter:
__decorate([
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__angular_core__["Input"])(),
__metadata('design:type', Object)
], AppComponent.prototype, "test2", void 0);
均使用 angular-cli
编译:ng build
.
angular 变化不大。不会设置输入或不会更频繁地调用 setter。然而,需要注意的是 setter 中有更多逻辑可以触发另一个变化检测。如果有,angular 将抛出已知错误(仅在开发模式下)
Expression has changed after it was checked.
因此,变化检测器的行为并没有不同,但可能会出现问题,具体取决于您在 setter
中放置的额外逻辑