我正在使用eval运行一些代码,这些代码将更改名为$scope的variables对象。
这是我的观察者:
$scope.$watch(function () {
return $scope.variables;
}, function (variables) {
console.log('changed!');
}, true);下面是我正在运行的代码(这只是示例代码;它可能是任何我无法预料的任意代码):
eval('$scope.variables.foo = "bar";\n$scope.variables.bar = "foo";');在这个例子中,观察者会被触发两次,并给出新的值。到目前一切尚好。缺少的信息是,第一个触发器是由eval调用中的第一行引起的,而第二个触发器是由第二行引起的(注意\n调用中的\n表示一个新行号)。
是否有一种使用角度或普通JavaScript实现这一目标的方法?我已经研究过像https://github.com/stacktracejs/stacktrace.js这样的工具,但它们似乎不起作用。
为了明确起见,我是而不是,寻找抛出错误时的行号。当激活观察者的回调时,我需要跟踪eval语句当前在哪一行,这样我就可以将该行号与对我正在观察的对象所做的更改相关联。
发布于 2015-11-25 08:58:15
可以将输入字符串拆分为\n,并插入新语句,跟踪行号。
var s = '$scope.variables.foo = "bar";\n$scope.variables.bar = "foo";\n'
var arr = s.split(/\n/);
var out = [];
for (var i = 0; i < arr.length; i++) {
out.push("console.log('current line: " + i + "');");
out.push(arr[i]);
}
out = out.join('\n');
console.log(out);
document.write('<pre>' + out + '</pre>');
你可以用你想要的东西代替console.log(),调用另一个函数,一个调试调用.
https://stackoverflow.com/questions/33910882
复制相似问题