加载AngularJS库后如何运行userscript(/greasemonkey)

加载AngularJS库后如何运行userscript(/greasemonkey),angularjs,userscripts,Angularjs,Userscripts,我只是想为AngularJS对象创建一些扩展,使AngularJS调试更加方便 但当我运行adduserscript时,它找不到角度对象。AngularJS库加载在标记的底部 UPD:@estus提供了正确的答案,但如果你想使用chrome,你需要通过扩展安装它 您可以找到最后的代码片段。在用户脚本运行时Angular不可用这一事实表明Angular是异步加载的,这对于任何未设置为document start的SPA检查来说都是很正常的,这不是理想的行为 用户脚本的常见解决方法是监视所需的变量:

我只是想为AngularJS对象创建一些扩展,使AngularJS调试更加方便

但当我运行adduserscript时,它找不到角度对象。AngularJS库加载在标记的底部

UPD:@estus提供了正确的答案,但如果你想使用chrome,你需要通过扩展安装它


您可以找到最后的代码片段。

在用户脚本运行时Angular不可用这一事实表明Angular是异步加载的,这对于任何未设置为document start的SPA检查来说都是很正常的,这不是理想的行为

用户脚本的常见解决方法是监视所需的变量:

var initWatcher = setInterval(function () {
    console.log('watch');
    if (unsafeWindow.angular) {
        clearInterval(initWatcher);
        init();
    }
}, 100);

function init() {
    console.log('angular', unsafeWindow.angular);
}
如果不需要跨浏览器兼容性,则可以使用FF-specific:

unsafeWindow.watch('angular', function (prop, oldVal, newVal) {
    console.log('watch');
    if (newVal) {
        unsafeWindow.unwatch('angular');
        // angular is still undefined ATM, run init() a bit later
        setTimeout(init);
    }
    return newVal;
});

function init() {
    console.log('angular', unsafeWindow.angular);
}

基本正确,但不会始终按预期工作,具体取决于userscript引擎和@grant模式。OP没有提供足够的细节。脚本注入可能是必需的,也是唯一通用的方法。或者,在支持@require的引擎上,@require为脚本作用域单独提供angular副本可能更明智。@BrockAdams是的,即使对于不同的GM版本,安全权限也会有所不同。我相信最后一个没有问题的版本是1.x,对于unsafeWindow来说,可怕的“权限被拒绝”是微不足道的。单独的副本无法解决问题,因为Angular应用程序状态存储在Angular对象中。但是在Angular加载到页面之前执行@require可能会有所帮助-Angular window.Angular,GM脚本可以先定义它。感谢您提供详细的答案。这很奇怪,但仍然不起作用。它找不到unsafeWindow.angular,这就是为什么我在控制台中看到许多手表线。把代码放在这里-@STEVER你的userscipt环境是什么?我已经检查过了,并在任意网站docs.angularjs.org,Greasemonkey 3.2上正常工作。我喜欢这个主意,我发现自己从控制台挖了几次注射器。根据我的需要对其进行了一些修改,请随意。@STEVER将@grant none更改为@grant unsafeWindow,这是针对Tampermonkey afaik的。