私は Angular モバイル SPA アプリを作成していますが、要件の一部に大量のリスト >> 詳細ページがあります。フィルター処理してリストに入力した後、アイテムをクリックして詳細ページに移動できます (許可されている場合は crud オプションがあり、モーダルのみを使用することはできません)。関連するデータやものをサービスに保存していますが、これはスクロール位置を維持するのに役立たず、ui-router-extras のスティッキー状態が理想的なようです。関連する場合に備えて、requirejsも使用しています。また、関連する場合は kendo.dataSource にバインドされた Kendo ListView を使用しています。
私はそれを実装しましたが、正しく実行したかどうかはわかりません。下にスクロールしてリスト項目をクリックすると、詳細が表示されます。戻るボタン ( を使用するディレクティブ、使用し$window.history.back();
てみ$state.go
ましたが同じことをしました) をクリックすると、戻って「キャッシュされた」バージョンが使用されますが、リストの一番上に表示されます。下にスクロールして別のアイテムをクリックしてから戻ると、期待どおりにスクロール位置が維持されます。
オンにする$stickyStateProvider.enableDebug(true);
と、出力は最初の呼び出しから後続の呼び出しまで同じに見えます。
ここに私の状態の設定があります:
return app.config(function ($stateProvider, $stickyStateProvider, $urlRouterProvider) {
$stickyStateProvider.enableDebug(true);
$urlRouterProvider.otherwise(function ($injector, $location) {
var $state = $injector.get("$state");
$state.go("home");
});
$stateProvider.state('home', {
url: '/home',
templateUrl: 'app/views/home.html',
controller: 'homeController',
controllerAs: "vm"
})
.state('cmmenu', {
url: '/cmmenu',
templateUrl: 'app/views/cmmenu.html',
controller: 'cmmenuController',
controllerAs: "vm"
})
.state('areainquiry', {
//sticky: true,
abstract: true,
url: '/areainquiry',
templateUrl: 'app/views/areainquiry.html'
})
.state('areainquiry.list', {
url: '/areainquirylist',
views: {
'areainquirylist@areainquiry': {
templateUrl: 'app/views/areainquirylist.html',
controller: 'areainquirylistController',
controllerAs: "vm"
}
},
sticky: true,
deepStateRedirect: true
})
.state('areainquiry.details', {
url: '/areainquirydetails/:areaInquiryId',
views: {
'areainquirydetails@areainquiry': {
templateUrl: 'app/views/areainquirydetails.html',
controller: 'areainquirydetailsController',
controllerAs: "vm"
}
}
})
.state('login', {
url: '/login',
templateUrl: 'app/views/login.html',
controller: 'loginController',
controllerAs: "vm"
});
})
抽象的な親ビューである areainquiry.html は次のとおりです。
<div ui-view="areainquirylist" ng-show="$state.includes('areainquiry.list')"></div>
<div ui-view="areainquirydetails" ng-show="$state.includes('areainquiry.details')"></div>
この画面を開くコードは次のとおりです。index.html に名前付きビューがなく、areainquiry.html までのすべてのビューがルートの名前のないビューを使用しています (「body」という名前を付けて、それを使用するようにすべて変更しましたが、うまくいきました同じ):
<div class="col-xs-6 col-md-4">
<a class="btn btn-default fullwidth" ui-sref="areainquiry.list">
<span class="{{ vm.areaInquiryButtonIcon }}"></span>
<br />
{{ vm.areaInquiryButtonText }}
</a>
</div>
抽象状態を使わずに、親 areainquiry と子 areainquiry.detail だけでそれを行う方法を見つけようとしていましたが、そのように機能させることができなかったので、このルートに行きました。