注: これは AngularJS でモーダル ダイアログを表示することではありません。このトピックには多くの質問と回答があります。
この質問は、ページのモーダル ダイアログ内で [OK] と [キャンセル] の両方に対応する方法に関するものです。変数が 1 つしかないスコープがあるとします。
$scope.description = "Oh, how I love porcupines..."
ページ上にモーダル ダイアログを表示し、そのダイアログ内で ng-model="description" を使用すると、実際には、入力した説明自体にすべての変更がリアルタイムで反映されます。それは悪いことです。なぜなら、そのダイアログをキャンセルするにはどうすればよいのでしょうか?
以下で説明することを行うように言うこの質問があります。それに対する受け入れられた答えは、私が思いついたのと同じ「解決策」です:
ボタンをクリックしてモーダルを表示すると、後ろの関数に戻り、モーダルに関連するデータの一時的なコピーが作成され、モーダルがポップアップする場合の方法がわかります。次に、「OK」(または「保存」など)により、一時的な値を実際のモデル値にコピーできます。
main.js (抜粋):
$scope.descriptionUncommitted = $scope.description;
$scope.commitChanges = function () {
$scope.description = $scope.descriptionUncommitted;
}
main.html (抜粋):
<input type="text" ng-model="descriptionUncommitted"/>
<button ng-click="commitChanges()">Save</button>
それに関する問題は、それが宣言的ではないことです! 実際、AngularJS のようなものは他にありません。必要なすべての変更を行うことができる ng-model-uncommitted="description" が必要であるかのようですが、別の宣言でトリガーしたときにのみコミットされます。どこかのプラグインにそのようなものはありますか、それともAngularJS自体が追加していますか?
編集:それを行う別の方法の例が適切であるようです。
main.js:
$scope.filename = "panorama.jpg";
$scope.description = "A panorama of the mountains.";
$scope.persist = function () { // Some function to hit a back end service. };
main.html:
<form>
<input type="text" ng-model-uncommitted="filename"/>
<input type="text" ng-model-uncommitted="description"/>
<button ng-commit ng-click="persist()">Save</button>
<button ng-discard>Cancel</button>
</form>
アイテムをグループ化する方法がわからないため、フォームタグを貼り付けたので、すべてが同じ「トランザクション」の一部であることは明らかでした(より適切な言葉がないため)。しかし、これがすべて自動的に行われ、モデル変数の複製されたコピーが初期値に使用され、入力に使用され、自動的に更新され、検証されるなどの方法が必要です。その後、最終的に破棄されるか、同じ値にコピーされます。ユーザーがコミットすることを決定した場合、最初はそれらを作成するために使用されました。
大規模な Web サイトで 20 のモーダルに対して何度も何度も同じ作業を行うには、コントローラーのコードよりもこのようなものの方が簡単ではないでしょうか? それとも私は気が狂っていますか?