$ watch on window.location无效

时间:2015-02-13 01:58:29

标签: javascript angularjs ember.js

目前正在创建一个位于其他应用程序中的chrome扩展程序。目前,该应用程序是一个基于ember的应用程序,因此通过javascript进行了网址更改。

在某些时候,这是有效的,但我不能让它继续工作。为什么它不起作用?

        $rootScope.$watch(function(){
            return window.location;
        }, function(value){
            console.log(value)
            $rootScope.locationChanged();
        }, true)

4 个答案:

答案 0 :(得分:0)

尝试使用$ window:

$scope.location = $window.location;
$watch('location', function () {
    ... // location changed
})

答案 1 :(得分:0)

location是一个对象,所以如果你要观看它,你需要这样做:

$scope.$watch('window.location', function(){
}, true);

第三个参数深入检查位置属性,而不是对位置本身的引用。如果任何属性发生变化,这将导致手表触发。

作为一种解决方法,您可以尝试在$ rootScope上侦听$ locationChangeSuccess事件

$rootScope.$on('$locationChangeSuccess', function() {
    $rootScope.locationChanged();
}

答案 2 :(得分:0)

你正在做什么是行不通的。您可以访问错误的窗口对象:

  

你做不到。扩展的后台页面在一个进程中运行,而更新的选项卡在单独的进程中运行。不同的进程无法共享对象,因此您无法从扩展的后台页面直接访问选项卡的窗口对象

来自:https://stackoverflow.com/a/22599856/2019281

  

内容脚本看到的窗口对象与页面看到的窗口对象不同。

来自:https://stackoverflow.com/a/12396221/2019281

答案 3 :(得分:0)

您可以使用以下三个功能来跟踪路线变化

HTML

<body ng-app="myApp" ng-controller="AppCtrl">......</body>

JS

.controller('AppCtrl', function ($scope, $rootScope, $log, $location) {

  $scope.$on('$routeChangeStart', function (event, toState, toParams, fromState, fromParams) {

  });

  $scope.$on('$routeChangeSuccess', function (event, toState, toParams, fromState, fromParams) {

  });

  $scope.$on('$routeChangeError', function (event, toState, toParams, fromState, fromParams) {

  });

});