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对复制的文件对象的非法调用的主要内容,如果未能解决你的问题,请参考以下文章
为啥 console.log.apply() 会抛出非法调用错误? [复制]