我正在尝试使用Google封闭库,正在使用the
official XhrIo guide。
我在xhr-quick2.js
示例中遇到了一些麻烦,转载如下:
goog.require('goog.net.XhrIo');
var xhr = new goog.net.XhrIo();
goog.events.listen(xhr, goog.net.EventType.COMPLETE, function(e) {
obj = this.getResponseJson();
log('Received Json data object with title property of "' +
obj['title'] + '"');
alert(obj['content']);
});
function getData(dataUrl) {
log('Sending simple request for ['+ dataUrl + ']');
xhr.send(dataUrl);
}
运行时,我收到错误:
未捕获的TypeError:无法读取未定义的属性“XhrIo”
如果我将事件监听器和xhr实例移动到getData
内
函数(在正文的onload
中调用),一切都很好。
goog.require('goog.net.XhrIo')
function getData(dataUrl) {
var xhr = new goog.net.XhrIo()
goog.events.listen(xhr, goog.net.EventType.COMPLETE, function(e) {
obj = this.getResponseJson()
log(`Received Json data object with title property of "${ obj["title"] }"`)
alert(obj["content"])
})
log(`Sending simple request for [${ dataUrl }]`)
xhr.send(dataUrl)
}
function log(msg) {
document.getElementById('log').appendChild(document.createTextNode(msg));
document.getElementById('log').appendChild(document.createElement('br'));
}
我认为这是因为goog.require
还没有完成导入net
goog.net.XhrIo
在第一个代码示例的第3行实例化。我想
理想的解决方案是通过闭包编译器运行我的所有代码,但我是
只是试验和other parts of the
documentation
意味着我的工作流程可以接受开发。
我可以在我的html中手动输入任何可以消除此内容的内容 问题?我还有其他方法吗?
答案 0 :(得分:2)
自从我上次使用闭包以来已经过了几年,但我不认为你可以在没有依赖编译器的情况下使用require。
Closure通过扫描goog.module
和goog.require
的JavaScript文件来编写deps.js
文件。必须先在JavaScript文件之前加载此文件。它列出了代码使用的所有模块,并以正确的顺序加载它们。
如果deps.js
首先出现,那么goog.net
将在到达您的代码时加载。第1行的代码goog.require('goog.net.XhrIo')
此时将被忽略。
根据文档,goog.require
会在正在执行的当前<script>
之后插入<script>
代码。因此,如果您想跳过使用deps.js
的步骤,那么您必须将所有内容包装在文档就绪回调中,或者将goog.require
添加到代码之前加载的JavaScript文件中。
我认为使用闭包依赖编写器创建deps.js
文件并不容易,也更容易。
这里有一个快速教程:
https://www.safaribooksonline.com/library/view/closure-the-definitive/9781449381882/ch01.html
这是用于编写deps.js
文件的CLI:
python ../closure-library/closure/bin/calcdeps.py \
--dep ../closure-library \
--path my_stuff.js \
--output_mode deps > deps.js
答案 1 :(得分:0)
对于未编译模式,必须预先加载所需文档。所以在你的html文档中你会有:
<!DOCTYPE html>
<html>
<head>
<script src="path/to/closure/base.js"></script>
<script>
goog.require('goog.net.XhrIo');
</script>
<script src="mysource.js"></script>
</head>
</html>
必须在单独的脚本标记中加载任何依赖项。那么上面的代码示例应该有效。