breezejs如何使用as datasource

时间:2014-11-24 09:16:52

标签: breeze

我现在正在使用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))

1 个答案:

答案 0 :(得分:1)

假设你正试图解决这样的问题:

  1. 网格与Breeze实体上的entityType和entityAspect属性不同。
  2. 此网格不知道如何处理Knockout样式&#34;属性&#34;这是功能。
  3. 使用Breeze实体的属性值创建POCO对象会使您与更改跟踪优势无关。
  4. 您可以尝试使用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变更跟踪。