我正在使用 AngularJS 进行数据绑定,除了使用多选类型的控件外,一切正常。它实际上不是在模型中添加或删除元素,而是用一个新数组替换它。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
我想到了。问题是现在轻风试图将请求实体分配给新添加的联系人。但是 Contact 实体有一个请求列表,而不仅仅是一个请求。这是一种多对多关系,微风不支持(至少在实体框架中)。为了使它工作,我将关联表作为一个实体公开。当用户在多选中选择一个联系人时,我会创建一个 RequestContact 实体,然后将其推送到 Request 实体上的 RequestContact 实体列表中。它远非整洁的代码,所以:
我的下一个问题是我正在使用 NHibernate,所以有没有办法让它工作或者很快就会得到支持?