我现在正在使用breezejs,我很高兴并且它的功能丰富,但breezejs的问题在于我几乎无法将它用作数据源。
没有网格可以显示数据而不会丢失功能,并且您无法将实体数组用作普通数组。 (所以你不能用它作为下拉的数据源...)
因此,为了在UI中显示数据,我最终将数据转换为普通数组并丢失Breeze功能(如跟踪更改),然后再保存转换回来。
像这样的一些代码用于转换为普通数组:
if(data.length>0)
{
var names = Object.getOwnPropertyNames(data[0]._backingStore);
var columns: string[] = [];
for (var i = 0; i < names.length; i++)
{
columns.push(names[i]); //Getting columns name
}
var newArray = [];
data.forEach((item, index, array) => {
newArray.push(item._backingStore);
});
}
我的问题是如何正确地使用breezejs在UI中显示数据? (我正在使用angualr(hottowel))
答案 0 :(得分:1)
假设你正试图解决这样的问题:
您可以尝试使用Object.defineProperty
创建POCO对象,使用Knockout observable作为属性的getter和setter函数。这是一个简单的例子:
打字稿+淘汰赛:
class PocoBreezeEntity {
constructor(private entity: breeze.Entity) {
entity.entityType.dataProperties.forEach(
dataProperty => {
Object.defineProperty(
this,
dataProperty.name,
{
get: entity[dataProperty.name],
set: entity[dataProperty.name],
enumerable: true,
configurable: true
});
});
}
}
Typescript + Angular:
class PocoBreezeEntity {
constructor(private entity: breeze.Entity) {
entity.entityType.dataProperties.forEach(
dataProperty => {
Object.defineProperty(
this,
dataProperty.name,
{
get: function() { return entity[dataProperty.name]; },
set: function(newValue) { entity[dataProperty.name] = newValue; },
enumerable: true,
configurable: true
});
});
}
}
通过这种方法,您可以获得POCO实体的好处,而不会失去Breeze变更跟踪。