Javascript $watch on window.location不工作

Javascript $watch on window.location不工作,javascript,angularjs,ember.js,Javascript,Angularjs,Ember.js,目前正在创建一个位于其他应用程序内部的chrome扩展。目前,该应用程序是一个基于余烬的应用程序,因此可以通过javascript更改其url 在某一点上,这是工作,但我不能让它工作了。为什么不起作用 $rootScope.$watch(function(){ return window.location; }, function(value){ console.log(value) $roo

目前正在创建一个位于其他应用程序内部的chrome扩展。目前,该应用程序是一个基于余烬的应用程序,因此可以通过javascript更改其url

在某一点上,这是工作,但我不能让它工作了。为什么不起作用

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

请尝试改用$window:

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

位置是一个对象,因此如果要观看它,您需要执行以下操作:

$scope.$watch('window.location', function(){
}, true);
第三个参数深入检查位置的属性,而不是位置本身的引用。如果任何属性发生变化,这将导致手表启动

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

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

你正在做的事行不通。您访问了错误的窗口对象:

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

发件人:

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


From:

您可以使用以下三个功能跟踪路线更改

HTML


抱歉,你能澄清一下吗,这是一个余烬应用程序,还是一个角度应用程序?我是一个在chrome扩展中的角度应用程序,必须在余烬应用程序(zendesk.com)中工作。好问题+我很乐意,只是出于好奇(我自己不能测试atm)你能给我一个
对象吗。观察一下
旋转吗?您是否使用ui路由?这有帮助吗?@iH8什么也没发生。这主意不管用。。。不过运气不好:(不用担心:)好主意请查看建议解决方案的更新,但我有兴趣了解这不起作用的原因。不起作用:(我想这是因为ember对我的angularjs不太好。我能想到的最好的解决办法是避免用$interval来观看位置。我讨厌ideaI目前以内容脚本的形式运行,因此在页面内运行并注入到页面中。不过,你离页面很近!后台只运行一次:)最后一句话说的是,内容脚本的窗口对象无法访问正在运行的页面的窗口对象。因此,内容脚本中的watch on window.location会监视内容脚本页面的窗口对象,而不是位置正在更改的页面的窗口对象,因此watch不会启动。以下是您可以注入到pag的原因e:“尽管内容脚本的执行环境和承载它们的页面彼此隔离,但它们共享对页面DOM的访问。”窗口属于(或是?)执行环境,因此与内容脚本隔离。来自:
<body ng-app="myApp" ng-controller="AppCtrl">......</body>
.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) {

  });

});