ルートのrouteProviderでreloadOnSearchがfalseに設定されています:
$routeProvider
.when(
"/film/list",
{
templateUrl: '/film/list.html',
controller: FilmListController,
reloadOnSearch: false
}
....
)
これを行ったのは、クエリ文字列の変更後にコントローラー全体を再読み込みしたくないためですが、それでも使用しており、URLは次のようになっていますfilm/list?sort=isbn&order=asc&offset=0
。これで、クエリ文字列が変更されるたびに、コントローラーから関数を呼び出したいと思います。そこで、コントローラーに$watchを設定しようとしました。
$scope.location = $location;
$scope.$watch( 'location.search()', function( search) {
$scope.list();
});
しかし、これは機能しません。クエリ文字列の個々のパラメータの変更を監視するように$watchを設定すると、機能します。ただし、クエリ文字列のすべてのパラメータに$watchを設定したくありません。私が今使っている解決策はこれです:
$scope.location = $location;
$scope.$watch( 'location.url()', function( url ) {
if($location.path() == '/film/list')
$scope.list();
});
したがって、検索を監視する代わりに、URL全体を監視し、次に、パスがrouteProviderで設定したパスであるかどうかを確認して、条件付きで関数を呼び出します。このソリューションで私が気に入らないのは、一致する$location.pathの値を明示的に入力する必要があることです。
誰かがより良い解決策を提案できますか、そしておそらく$watchが$location.search()で機能しない理由を私に説明できますか?