Angular.js复制的File对象上的非法调用

Vas*_*aka 7 javascript angularjs angularjs-scope

嗯,没有太多要解释的. https://jsbin.com/raqajelufu/edit?html,js,output使用angular.copy复制后,任何File对象属性访问都会引发非法调用异常.

考虑到$ watch根据https://docs.angularjs.org/api/ng/type/$rootScope.Scope在内部使用angular.copy,是否有任何解决办法,这将使得观察File对象成为可能?

小智 3

您在哪个浏览器上看到了这个问题?

不久前有人问过类似的问题,得出的结论是这可能与 Chrome v43 有关。

与该问题相关的一些资源:

据推测,Chrome v43 不喜欢angular.copy 源代码中的以下内容:

var emptyObject = Object.create(Object.getPrototypeOf(source));
Run Code Online (Sandbox Code Playgroud)

您可以尝试以下任一方法来查看是否可以抑制您的错误(无论您选择哪种浏览器):

  • 当您需要对某些内容进行深层复制时,不要使用angular.copy, 通过避免深度监视 la $scope.$watch('', fn, true)( jsbin ) 并从 lodash 获取类似_.cloneDeep ( jsbin ) 的东西。
  • 返回 Chrome v42(如果您使用的是 v43)。
  • 回到 Angular 1.2.28,其中angular.copy没有调用上面的行。来源jsbin

如果你想深入观察但避免angular.copy,我会做这样的事情(在lodash.merge的帮助下):

$scope.$watch(function () {
  return _.merge(src, dest);
}, callback);
Run Code Online (Sandbox Code Playgroud)

另一个 jsbin

这样你就不会打电话angular.copy,而且仍然有一个“深度监视”设置。请记住,这是一个非常幼稚的例子,我还没有彻底测试它,但我认为你可以用最少的努力使它的工作方式与有角度的深手表非常相似。


免责声明: 我还没有真正深入研究源代码angular.copyconsole/或 Chrome v43 的实际情况。这在某种程度上是一个灰色地带,但根据上述建议,我尚未触发非法调用。