データ バインディングに 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 を使用しているということです。それを機能させる方法はありますか、それともすぐにサポートされますか?