我正在尝试将Breeze与使用反应形式的Angular应用程序一起使用。
FormGroup.patchValue()
函数接受我的breeze实体对象,并且应该能够将其修补到我的表单中。
但是,patchValue()
使用Object.keys()
迭代对象属性以了解要修补的值。
Object.keys()
无法识别继承的属性。
breeze工具生成的typescript对象具有使用继承分配的属性。
因此,除了entityAspect
和_backingStore
之外,Object.keys()都不会看到任何属性。
因此,这使得Angular中的反应形式与微风实体完全无用。
有没有办法可以避免使用继承来分配breeze属性,还是可以使用某种通用转换函数来获取Object.keys()来查看我的breeze实体对象上的所有属性?
答案 0 :(得分:0)
我不确定这是否会解决它(不熟悉微风),但我认为你可以做到:
function getKeys(obj) {
var myKeys = Object.keys(obj);
var protoKeys = Object.keys(obj.constructor.prototype);
if (Object.getPrototypeOf(obj)) {
protoKeys = protoKeys.concat(getKeys(Object.getPrototypeOf(obj)));
}
return [...new Set(myKeys.concat(protoKeys))].filter(c => c !== 'constructor');
}
其中,使用来自:
的转换后的打字稿class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
class CustomGreeter extends Greeter {
howdy() {
return 'howdy';
}
}
let greeter = new Greeter("world");
会给你清单:
["greeting", "howdy", "greet"]
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var Greeter = /** @class */ (function () {
function Greeter(message) {
this.greeting = message;
}
Greeter.prototype.greet = function () {
return "Hello, " + this.greeting;
};
return Greeter;
}());
var CustomGreeter = /** @class */ (function (_super) {
__extends(CustomGreeter, _super);
function CustomGreeter() {
return _super !== null && _super.apply(this, arguments) || this;
}
CustomGreeter.prototype.howdy = function () {
return 'howdy';
};
return CustomGreeter;
}(Greeter));
var greeter = new CustomGreeter("world");
function getKeys(obj) {
var myKeys = Object.keys(obj);
var protoKeys = Object.keys(obj.constructor.prototype);
if (Object.getPrototypeOf(obj)) {
protoKeys = protoKeys.concat(getKeys(Object.getPrototypeOf(obj)));
}
return [...new Set(myKeys.concat(protoKeys))].filter(c => c !== 'constructor');
}
console.log(getKeys(greeter))