如何让Object.keys()读取微风实体的属性?

时间:2018-04-06 21:31:04

标签: javascript breeze

我正在尝试将Breeze与使用反应形式的Angular应用程序一起使用。

FormGroup.patchValue()函数接受我的breeze实体对象,并且应该能够将其修补到我的表单中。

但是,patchValue()使用Object.keys()迭代对象属性以了解要修补的值。

Object.keys()无法识别继承的属性。

breeze工具生成的typescript对象具有使用继承分配的属性。

因此,除了entityAspect_backingStore之外,Object.keys()都不会看到任何属性。

因此,这使得Angular中的反应形式与微风实体完全无用。

有没有办法可以避免使用继承来分配breeze属性,还是可以使用某种通用转换函数来获取Object.keys()来查看我的breeze实体对象上的所有属性?

1 个答案:

答案 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))