$ location更改未在ngchange上应用,但在ngclick上应用

时间:2016-04-26 11:02:30

标签: javascript angularjs

我有2个函数,一个是由ng-click触发的,一个是由ng-change或$ watch触发的(我试过两个)。

ng-click方法如下所示:

$scope.setGenre = function(x) {
    if (genre == x) {
        genre = 0;
    } else {
        genre = x;
    }
    $location.search().genre = genre;
    $scope.getVideos();
};

单击该按钮时,直接在url中将genre参数设置为指定的值。我不需要做范围。$ apply或其他。

ng-change或$ watch方法看起来实际上是相同的:

$scope.$watch('search', function() {
    $location.search().search=$scope.search;
    $scope.getVideos();
});

但显然该参数未在网址中设置。如果我通过单击运行ng-click功能,则设置搜索参数。

我尝试将$location.search().search=$scope.search;包装在$ timeout或$ scope.apply中,但问题是摘要总是在运行。

1 个答案:

答案 0 :(得分:0)

我找到的解决方案是简单地使用$location.url()代替$location.search()。对我来说,使用ng-change或$ watch时,为什么$location.search的工作方式不同仍然不明确。

这是我的新功能:

$scope.$watch('search', function() {
    $location.url('/videos?genre='+genre +"&search="+ $scope.search, false);
    $scope.getVideos();
});

只有在我想要编辑$location.url()函数时才能使用reloadOnSearch:

app.run(['$route', '$rootScope', '$location', function ($route, $rootScope, $location) {
    var original = $location.url;
    $location.url = function (url, reload) {
        if (reload === false) {
            var lastRoute = $route.current;
            var un = $rootScope.$on('$locationChangeSuccess', function () {
                $route.current = lastRoute;
                un();
            });
        }
        return original.apply($location, [url]);
    };
}]);

这让我传递一个布尔参数,这样我就可以动态地使用reloadOnSearch。