目前正在创建一个位于其他应用程序中的chrome扩展程序。目前,该应用程序是一个基于ember的应用程序,因此通过javascript进行了网址更改。
在某些时候,这是有效的,但我不能让它继续工作。为什么它不起作用?
$rootScope.$watch(function(){
return window.location;
}, function(value){
console.log(value)
$rootScope.locationChanged();
}, true)
答案 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
内容脚本看到的窗口对象与页面看到的窗口对象不同。
答案 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) {
});
});