0

我正在使用 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,所以有没有办法让它工作或者很快就会得到支持?

4

1 回答 1

1

您正在正确列出选项,但您正在尝试直接将值写入导航属性 - 您不能这样做,永远无法做到,而且设计上不应该这样做。您想要创建从子级到父级的导航属性,而不是将子级推入父级的属性中,而它们之间没有键。

为什么不设置一个数组来放入你选择的对象,然后$watch在数组上使用ngChange并设置

contact.request = thisRequest;

每当它被添加和

contact.request = null;

当它被删除?

于 2013-10-21T13:35:41.340 回答