2013-08-02 18 views
18

連絡先リストから選択した連絡先にメールを送信するアプリがあります。 ユーザーが「受信者」を選択すると、検索、フィルタリングなどの別のビュー/ページが表示されます。「電子メールの送信」と「連絡先リスト」は、ngビューに読み込まれた異なるHTML部分です。角型UI-Routerで状態を保持

私は連絡先リストから誰かを選択すると、同じポイント(同じ状態)に戻るので、送信フォームの状態を維持する必要があります。私は別のソリューション($ rootScope、ng-showを使った隠れたdivなど)について読んでいますが、UI-routerがState Managerの役に立つかどうかを知りたいと思います。そうでない場合は、すぐに使える他のソリューションがありますか?

ありがとうございます!

+0

可能重複[AngularJS - ルートの間でデータを保存](HTTP::

(function(){ 'use strict'; angular.module('app').service('StateService', function(){ var _states = {}; var _save = function(name, scope, fields){ if(!_states[name]) _states[name] = {}; for(var i=0; i<fields.length; i++){ _states[name][fields[i]] = scope[fields[i]]; } } var _load = function(name, scope, fields){ if(!_states[name]) return scope; for(var i=0; i<fields.length; i++){ if(typeof _states[name][fields[i]] !== 'undefined') scope[fields[i]] = _states[name][fields[i]]; } return scope; } // ===== Return exposed functions ===== // return({ save: _save, load: _load }); }); })(); 

それを使用するには、私はこのような私のコントローラの最後にいくつかのコードを置きます/ /stackoverflow.com/questions/16802857/angularjs-saving-data-between-routes) –

答えて

21

私が行った解決策は、サービスを自分のデータ/モデルストレージとして使用していることです。コントローラーの変更を超えて保持されます。コントローラでそれを使用して

ユーザーサービス(コントローラーの変更渡って持続する我々のモデル)

app.factory('userModel', [function() { 
    return { 
     model: { 
      name: '', 
      email: '' 
     } 
    }; 
}]); 

function userCtrl($scope, userModel) { 
    $scope.user = userModel; 
} 

本の他の利点は、あなたが再利用できるということですあなたのモデルを他のコントローラーと同じようにeasly。

+0

私はサービスを使用した。それはうまく見えます。しかし、モデルがルートパラメータ(例えば:$ routeParams.myId)に基づいて作成された場合はどうでしょうか? –

+2

結果をコントローラではなくサービスに格納します。それ以外のものはすべて同じである可能性があります – Anton

+2

あなたの例は不完全であるようですが、サービスモデルの変更を他のコントローラに[ブロードキャスト](http://onehungrymind.com/angularjs-communicating-between-controllers/)する必要があります。 [この例](http://stackoverflow.com/a/16559855/168815)は、アプリケーションから離れてナビゲートするときの状態を保存するためのアカウントです。 –

2

私はAngular-Multi-Viewがこのシナリオでは神話であることを発見しました。他のビューがルートを処理している間、あるビューで状態を保持することができます。また、複数のビューで同じルートを処理できます。

これはUI-Routerで行うことができますが、IMHOが醜いことができるビューをネストする必要があります。

8

これが推奨されるかどうかはわかりませんが、コントローラのスコープからプロパティを保存/ロードするためのStateServiceを作成しました。それは次のようになります。

angular.module('app').controller('ExampleCtrl', ['$scope', 'StateService', function ($scope, StateService) { 
    $scope.keyword = ''; 
    $scope.people = []; 

    ... 

    var saveStateFields = ['keyword','people']; 
    $scope = StateService.load('ExampleCtrl', $scope, saveStateFields); 
    $scope.$on('$destroy', function() { 
     StateService.save('ExampleCtrl', $scope, saveStateFields); 
    }); 
}]); 
+0

は私にとって可能な解決策のようです。このプロセスで成功したことはありますか?私は今も状態を保存するための仕組みを実装する必要があります。 Greets Mario – SQueek

+1

私はプロダクションアプリで使っていませんが、開発中のアプリはこのコードを使っていて、とてもうまくいくようです。 –

+0

スーパージョブジャスティン!私の同僚はこのソリューションに満足しています!素敵な週末を祈ってください。 – SQueek

関連する問題