古典的なリスト/詳細 UI を実装しようとしています。リスト内のアイテムをクリックすると、リストを表示したままそのアイテムの編集フォームを表示したい。私は Angular の 1 ページあたり 1 ビューの制限を回避しようとしており、すべての URL を同じコントローラー/ビューにルーティングすることでそれを行うことにしました。(おそらくこれが私の問題の根源であり、私は代替手段を受け入れています。)
ルーティング:
$routeProvider
.when('/list', { templateUrl: '/Partials/Users.html', controller: UserController })
.when('/edit/:UserId', { templateUrl: '/Partials/Users.html', controller: UserController })
.otherwise({ redirectTo: '/list' });
ビュー (/Partials/Users.html):
<!-- List of users -->
<div ng-repeat="user in Users">
<a href="*/edit/{{ user.Id }}">Edit {{ user.Name }}</a>
</div>
<!-- Edit form -->
<div>
{{ SelectedUser.Name }}
</div>
コントローラ:
function UserController($scope, $routeParams) {
// the model for the list
$scope.Users = GetUserListFromService();
// the model for the edit form
if ($routeParams.UserId != null)
$scope.SelectedUser = GetUserFromService($routeParams.UserId);
}
問題:
- 編集リンクをクリックすると、コントローラーが新しいスコープで再インスタンス化されるため、ユーザー リストを再初期化する必要があります。(より複雑な例では、ユーザーからの入力をモデルにバインドして保存することができ、これも失われます。) 前のルートからのスコープを保持したいと思います。
- 別のコントローラーを使用することをお勧めします (または、他の多くの Angular 開発者が不満を言っているように、複数の表示ビューを持つ機能!) が、スコープを失うという同じ問題につながります。