フォームが複数のページにまたがっている状況があります(理想的ではないかもしれませんが、それはそうです)。ユーザーがステップ間を行き来するときに状態を簡単に覚えられるように、フォーム全体に1つのスコープを設定して、その中に記入していきたいと思います。
だから、非常に擬似コードで行う必要があります:
$scope.val = <Some dynamic data>
を設定$scope.val
は、最後のページと同じ値のままです。スコープのデータを何らかの方法で永続化するのが正しい方法ですか、それとも他の方法がありますか?もちろん、データベースに保存することを除いて、ルート間で永続的なスコープを持つコントローラーを作成することもできます。
サービスはアプリの存続期間を通じて持続するため、サービスを使用する必要があります。
ユーザーに関するデータを保存するとします
これはサービスを定義する方法です:
app.factory("user",function(){
return {};
});
最初のコントローラーで:
app.controller( "RegistrationPage1Controller",function($scope,user){
$scope.user = user;
// and then set values on the object
$scope.user.firstname = "John";
$scope.user.secondname = "Smith";
});
app.controller( "RegistrationSecondPageController",function($scope,user){
$scope.user = user;
// and then set values on the object
$scope.user.address = "1, Mars";
});
サービスは機能しますが、通常のスコープとコントローラーのみを使用してそれを行う論理的な方法は、モデルの構造を反映するようにコントローラーと要素をセットアップすることです。特に、親スコープを確立する親要素とコントローラーが必要です。フォームの個々のページは、親の子であるビューに存在する必要があります。子ビューが更新されても、親スコープは持続します。
i-router を使用していると想定しているため、名前付きビューをネストできます。次に、擬似コードで:
<div ng-controller="WizardController">
<div name="stepView" ui-view/>
</div>
次に、WizardControllerは、マルチページフォームのステップ全体で保持するスコープ変数を定義します(これを "ウィザード"と呼びます)。その後、ルートはstepView
のみを更新します。各ステップには独自のテンプレート、コントローラー、およびスコープを設定できますが、それらのスコープはページごとに失われます。ただし、WizardControllerのスコープはすべてのページで保持されます。
子コントローラーからWizardControllerスコープを更新するには、$scope.$parent.myProp = 'value'
などの構文を使用するか、各スコープ変数のWizardControllerで関数setMyProp
を定義する必要があります。それ以外の場合、子コントローラーから直接親スコープ変数を設定しようとすると、子自体に新しいスコープ変数を作成し、親変数をシャドウイングします。
説明が難しいので、完全な例がないことをおizeびします。基本的に、フォームのすべてのページで保持される親スコープを確立する親コントローラーが必要です。
2つの方法でコントローラー間でデータを渡すことができます
$rootScope
以下のサンプルは、モデルを使用した値の受け渡しを示しています
app.js
angular.module('testApp')
.controller('Controller', Controller)
.controller('ControllerTwo', ControllerTwo)
.factory('SharedService', SharedService);
SharedService.js
function SharedService($rootScope){
return{
objA: "value1",
objB: "value2"
}
}
//コントローラーAの値を変更します
Controller.js
function Controller($scope, SharedService){
$scope.SharedService = SharedService;
$scope.SharedService.objA = "value1 modified";
}
// controllertwoの値にアクセスします
ControllerTwo.js
function ControllerTwo($scope, SharedService){
$scope.SharedService = SharedService;
console.log("$scope.SharedService.objA"+$scope.SharedService.objA); // Prints "value1 modified"
}
お役に立てれば。