【发布时间】:2015-08-12 14:30:02
【问题描述】:
我只是想为 Angular 对象创建一些扩展,让 AngularJS 调试更方便。
但是当我运行添加用户脚本时,它找不到角度对象。 AngularJS 库加载在标签的底部。
UPD:@estus 提供了正确答案,但如果您想使用 chrome,您需要通过 Tampermonkey 扩展安装它。
你可以找到最终代码sn -p here。
【问题讨论】:
标签: angularjs userscripts
我只是想为 Angular 对象创建一些扩展,让 AngularJS 调试更方便。
但是当我运行添加用户脚本时,它找不到角度对象。 AngularJS 库加载在标签的底部。
UPD:@estus 提供了正确答案,但如果您想使用 chrome,您需要通过 Tampermonkey 扩展安装它。
你可以找到最终代码sn -p here。
【问题讨论】:
标签: angularjs userscripts
当用户脚本运行时 Angular 不可用这一事实表明 Angular 是异步加载的,这对于任何 SPA 来说都是很正常的(还要检查 @run-at 是否不设置为 @987654326 @,这不是理想的行为)。
用户脚本的通常解决方法是监视所需的变量:
var initWatcher = setInterval(function () {
console.log('watch');
if (unsafeWindow.angular) {
clearInterval(initWatcher);
init();
}
}, 100);
function init() {
console.log('angular', unsafeWindow.angular);
}
如果不需要跨浏览器兼容性,则可以使用 FF 特定的Object.prototype.watch 代替:
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);
}
【讨论】:
@grant 模式。 OP 没有提供足够的细节。可能需要脚本注入(并且是唯一通用的方法)。或者,在支持 @require 的引擎上,只为 @require 一个单独的 angular 副本用于脚本范围可能更聪明。
angular 对象中。但是在页面加载 Angular 之前执行 @require 可能会有所帮助 - Angular won't redefine window.angular,GM 脚本可以先定义它。
@grant none 更改为 @grant unsafeWindow,这是 Tampermonkey afaik 特有的。