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

私はそれを考え出した。問題は、breeze が Request エンティティを新しく追加された Contact に割り当てようとすることです。ただし、Contact エンティティには、単一の要求だけでなく、要求のリストがあります。これは多対多の関係であり、breeze ではサポートされていません (少なくとも Entity Framework では)。それを機能させるために、関連付けテーブルをエンティティとして公開しました。ユーザーが複数選択で連絡先を選択すると、RequestContact エンティティが作成され、Request エンティティの RequestContact エンティティのリストにプッシュされます。それはきれいなコードとはほど遠いので:

私の次の質問は、私が NHibernate を使用しているということです。それを機能させる方法はありますか、それともすぐにサポートされますか?

4

1 に答える 1