Angular.js对复制的文件对象的非法调用

Posted

技术标签:

【中文标题】Angular.js对复制的文件对象的非法调用【英文标题】:Angular.js Illegal invocation on copied File object 【发布时间】:2015-10-12 16:46:54 【问题描述】:

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

考虑到 $watch 根据https://docs.angularjs.org/api/ng/type/$rootScope.Scope 在内部使用 angular.copy,是否有任何解决方法可以让监视 File 对象成为可能?

【问题讨论】:

您是否尝试过使用 $watch 或仅像示例中那样显式调用 copy?您可能可以通过提供一个复制目标来解决它,因为问题似乎是当它尝试使用 Object.create(...) 在内部创建一个时,虽然我个人不知道如果你得到了如何解决$watch 调用 copy 本身时出错.. 我认为您的问题不在于复制,而在于实例化,请参阅***.com/questions/8390855/… 调用var f = new File([],"") 然后f.name 不会产生错误,所以我仍然认为问题在于复制 @aw04,是的 $watch 也会抛出该错误。这是一个示例,表明jsbin.com/gatumewuwa/edit?html,js,output 【参考方案1】:

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

不久前有人问过similar question,得出的结论是它可能与 Chrome v43 有关。

与问题相关的一些资源:

chromium bug report webkit bug report webkit bug 'conclusion' angular issue regarding .copy and .equals

据说,Chrome v43 angular.copy source 中如下所示:

var emptyObject = Object.create(Object.getPrototypeOf(source));

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

不要使用angular.copy,当你需要对某些东西进行深度复制时,避免使用$scope.$watch('', fn, true)(jsbin) 并从lodash 使用类似_.cloneDeep(jsbin) 的东西。 回到 Chrome v42(如果您使用的是 v43)。 回到 Angular 1.2.28,angular.copy 没有调用上述行。 source (jsbin)

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

$scope.$watch(function () 
  return _.merge(src, dest);
, callback);

yet another jsbin

这样你就不会打电话给angular.copy,你仍然会有一个“深度观察”设置。请记住,这是一个非常幼稚的例子,我还没有彻底测试过它,但我认为你可以用最小的努力让它与有角的深表非常相似。


免责声明: 我还没有真正深入了解angular.copy 源、console 和/或 Chrome v43 的实际情况。这是一个灰色地带,但根据上述建议,我还没有触发非法调用。

【讨论】:

以上是关于Angular.js对复制的文件对象的非法调用的主要内容,如果未能解决你的问题,请参考以下文章

angular.js的$timeout

为啥 console.log.apply() 会抛出非法调用错误? [复制]

如何使用angular js将aws s3文件复制到同一个存储桶中的特定文件夹

Angular js post无法序列化对象

Angular JS中的异步调用问题

angular js中 http.get方法怎么用