下划线模板内的 FB.api() 调用
FB.api() calls inside underscore template
下划线模板文档建议以下内容应该是可能的,但它对我不起作用。执行模板只会为此返回任何内容。
<% FB.api('/me', function(response){ %>
<%= response.name %>
<% }); %>
这是一个完全有效的模板;事实上,编译后的JavaScript版本看起来像这样(为了可读性而重新格式化):
function(obj) {
var __p = '';
var print = function() { __p += Array.prototype.join.call(arguments, '') };
with(obj || {}) {
__p += ''n';
FB.api('/me', function(response) {
__p += ''n' + response.name + ''n';
});
__p += ''n';
}
return __p;
}
这并没有错。顺便说一句,如果你想查看模板的 JavaScript,你可以查看编译的下划线模板的 source
属性:
var t = _.template(raw_template);
console.log(t.source);
但是,它不会执行您期望它执行的操作。您的问题是FB.api
调用是 AJAX 调用,A 代表异步调用。因此,当您的回调被调用时(即 <%= response.name %>
执行),模板将被转换为 HTML 并添加到 DOM 中,并且不会再查看__p
变量。序列如下所示:
- 编译模板
- 并调用已编译的模板函数。
-
FB.api
被召唤了。 - 模板函数返回一些 HTML。
- 来自 3 的 HTML 被添加到 DOM 中。
- 时间流逝。
- Facebook会做出回应,您的
FB.api
回电会被调用。 -
response.name
追加到__p
缓冲区。
你将不得不把你的逻辑翻过来一点。您的FB.api
调用应位于模板之外:
var t = _.template(...);
FB.api('/mu', function(response) {
var html = t({ response: response });
// Somehow add html to the DOM
});
这样,在所有数据准备就绪之前,您不会尝试使用该模板。
相关文章:
- 如何在 API 调用后和 if 语句中启用提交按钮
- NodeJS API调用中Array中的Push和Pull元素
- 在Chrome扩展内部输出Google API调用
- IE11中的第二个调用取消了第一个Fetch API调用
- RxjsObservable:通过一个API调用订阅不同的值
- 通过API调用过滤数据
- 给出<选项>标记一个类?API调用不工作
- 使用Angular获取数据API调用时出错
- javascript API调用导致旧数据
- 在一个服务中引用多个API调用(Angular)
- 背景:'userId'在SignUp API调用后为null
- 对/Token的ASP Web API调用间歇性
- Web API 调用在设备模式下失败
- 将使用 $.ajax() 和 JSONP 的 API 调用替换为服务器到服务器的 API 调用
- 如何将 JavaScript Yahoo Weather API 调用属性替换为变量
- 谷歌日历 api 调用可以在角度工厂内返回承诺吗?
- 仅显示 Google 表格中来自 api 调用的最新数据行
- 我的 API 调用没有返回任何内容
- 如何通过声云 api 调用获取用户 ID
- 在 api 调用$resource显示错误和成功消息