我正在构建一个结合了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>
答案 0 :(得分:0)
通过将breeze实体数据克隆到单独的对象和新的集合中,我能够解决这个问题。