使用ngGrid和breeze.js更新实体关联

时间:2014-09-16 17:46:05

标签: angularjs breeze

我正在构建一个结合了AngularJS,ngGrid和breeze.js的Web应用程序。

我的ORM中有一个实体关联,其中父实体(称为'Foo')与一个'Bar'实体有关联。

breeze.js查询并加载'Foo'实体及其'Bar'关联。

在我的ngGrid中,我想让用户通过提供一个下拉输入来更改关联,该输入显示本地缓存的每个Bar实体的名称。在我的ngGrid的columnDefs属性中,我有这个用于目标字段的定义:

columnDefs: [
           {
               field: 'Bar', displayName: 'Bar', enableCellEdit: true,
               cellTemplate: '<select ng-class="\'colt\' + col.index" ng-input="COL_FIELD" ng-model="data[row.rowIndex].Bar" ng-options="bar as bar.name for bar in bars"  />'
           }]

在我的角度控制器中,我在我的范围内定义了“条形”,作为从本地缓存查询并在ng-options中表示的微风实体数组

对于ng-model,“data”是每个Foo实体的范围数组,也是ngGrid数据的源。

下拉加载好。我可以看到Foo的当前值作为选定的选项,我得到每个可选择的Bar名称的下拉列表,以将Foo的关联更改为新的Bar。

问题是,当我从下拉列表中选择一个新的Bar时,breeze.js框架尝试将所选栏添加到breeze缓存并在更改关联之前将其视为新的,而实际上bar是一个已经存在的实体在缓存中。抛出的错误是“具有此密钥的实体已经在缓存中”

在尝试使用ng-change捕获更改或使用EntityManager entityChanged事件处理breeze更改之前,会发生这种情况。

我无法弄清楚为什么breeze.js将下拉列表中的选定栏视为新实体,而不仅仅是改变Foo的关联以及如何处理它?<​​/ p>

1 个答案:

答案 0 :(得分:0)

通过将breeze实体数据克隆到单独的对象和新的集合中,我能够解决这个问题。