我正在使用AngularJS进行数据绑定,除非我使用multi-select类型的控件,否则一切正常。它实际上用新数组替换它,而不是向模型添加或删除元素。然后Breeze提出以下异常:
Nonscalar navigation properties are readonly - entities can be added or removed but the collection may not be changed.
Angular的问题在于,大多数控件(如果不是全部)都使用$ setViewValue(value)函数,该函数将新值作为参数,在本例中为数组。
这里的微风是不是太有限了?有人为此方案有解决方法吗?
我的代码是:
<select ng-multiple="true" multiple class="multiselect" data-placeholder="Select Contacts" ng-model="request.contacts" ng-options=" ng-options="c as c.username for c in contacts track by c.id" />
其中contacts是绑定到父控制器的实体的导航属性,myContacts是$ scope上的联系人集合。
修改
我已将代码更改为使用ng-change和中间集合:
<select ng-multiple="true" multiple class="multiselect" data-placeholder="Select Contacts" ng-change="updateBreezeContacts()" ng-model="model.selectedContacts" ng-options="c as c.username for c in contacts | filter:{clientId: requestService.selectedRequest.client.id} track by c.id"></select>
$scope.updateBreezeContacts = function () {
for (var i = 0; i < $scope.model.selectedContacts.length; i++) {
$scope.requestService.selectedRequest.contacts.push($scope.model.selectedContacts[i]);
}
}
当我将实体推送到数组时,我仍然会收到上面报告的错误消息。
怎么回事?
编辑2
我明白了。问题是现在breeze尝试将Request实体分配给新添加的Contact。但是Contact实体有一个请求列表,而不仅仅是一个请求。这是一个多对多的关系,breeze不支持(至少使用Entity Framework)。 为了使它工作,我将关联表暴露为一个实体。当用户在多选中选择一个联系人时,我然后创建一个RequestContact实体,然后将该实体推送到Request实体上的RequestContact实体列表中。它远非整洁的代码所以:
我的下一个问题是我正在使用NHibernate,有没有办法让它工作或者很快会得到支持?
答案 0 :(得分:1)
您正在正确地列出选项,但是您正试图直接将值写入导航属性 - 您无法做到这一点,从来没有能够做到,并且设计应该无法做到。您想要从子项创建一个导航属性到父项,而不是将子项推送到父项的属性中,而它们之间没有键。
为什么不设置一个数组来放置你选择的对象,然后 $ watch 在数组上使用 ngChange 并设置
contact.request = thisRequest;
无论何时添加
contact.request = null;
何时删除?