我在这里复制了这个错误(Aurelia 的丑陋使用,但为了证明这一点):https://jberggren.github.io/GoogleAureliaBugReproduce/
如果我加载 Google API 并尝试在 Google Drive 中列出我的文件,我从 Googles quickstart 派生的代码工作正常。如果我在加载 Aurelia 后使用相同的代码,我会收到来自 gapi 的脚本错误说明 Uncaught Error: arrayForEach was called with a non array value at Object._.Sa (cb=gapi.loaded_0:382) at Object._.eb (cb=gapi.loaded_0:402) at MF (cb=gapi.loaded_0:723) at Object.HF (cb=gapi.loaded_0:722) at Object.list (cb=gapi.loaded_0:40) at listFiles (index.js:86) ...
调试时,似乎是某种数组检查(Chroms 说“ native 代码”)在加载 Aurelia 后失败。在我寻找答案的过程中,我发现另外两个人有同样的问题但没有解决方案( Aurelia gitter question 、 SO Question )。不知道是否要向 Aurelia 团队、Google 报告或实际问题所在。
帮助我,你是我唯一的希望。
最佳答案
这不是一个完美的解决方案,但有效。
aurelia结合
https://github.com/aurelia/binding/blob/master/src/array-observation.js
由于某些原因,Aurelia 会覆盖 Array.prototype.*
。
gapi(尤其是电子表格)
Gapi lib 检查以确保它是 native 代码与否。
// example
const r = /\[native code\]/
r.test(Array.prototype.push)
结论
所以,我们必须猴子修补。
gapi.load('client:auth2', async () => {
await gapi.client.init({
clientId: CLIENT_ID,
discoveryDocs: ['https://sheets.googleapis.com/$discovery/rest?version=v4'],
scope: 'https://www.googleapis.com/auth/spreadsheets',
});
// monkey patch
const originTest = RegExp.prototype.test;
RegExp.prototype.test = function test(v) {
if (typeof v === 'function' && v.toString().includes('__array_observer__.addChangeRecord')) {
return true;
}
return originTest.apply(this, arguments);
};
});
关于google-drive-api - 加载 Aurelia 会破坏 Google API,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43040405/