模板内的车把和倒计时
handlebars and countdown inside template
使用 Final Countdown Plugin and Handlebars.js.
这两个插件单独运行都很好。下面的<div>
会给我倒计时(这里倒计时到2017/01/01):
<div id="getting-started"></div>
<script type="text/javascript">
$("#getting-started").countdown("2017/01/01", function(event) {
$(this).text(
event.strftime('%D days %H:%M:%S')
);
});
</script>
我这里有一个简单的把手示例:
<script type ="mustache/x.tmpl" id="helloTmpl">
{{#each this}}
{{endTime}}
{{/each}}
</script>
其中 {{endTime}}
是我想要倒计时的结束时间(而不是 2017/01/01)。它在 {{#each}}
循环内并且会有 运行 很多 {{endTime}}
.
有人知道使这成为可能的想法吗?并为每个 {{endTime}}
倒计时?我试图把上面的倒计时插件放到一个帮助程序中,但没有成功,而且变得有点乱。提前致谢。
编辑:结果
感谢@76484。通过对您的示例感到困惑,我现在可以使用我的设置,太棒了!我 运行 function populate()
每 3-5 秒用新数据刷新我的模板。这意味着我还必须每 3-5 秒 运行 倒计时功能,即使 endTime
数据没有改变。我喜欢这样:
function populate()
{
var url = apiurl + 'api/myGreatData';
$.ajax
({
type: 'POST',
cache: false,
url: url,
dataType: 'json',
success: function (response)
{
var source = document.getElementById("helloTmpl").innerHTML;
var tmpl= Handlebars.compile(source);
var html = tmpl(response);
var box = document.getElementById("box");
box.innerHTML = html;
// Countdown Timer
$('[data-countdown]').each(function (index, el) {
var $el = $(el);
var finalDate = $el.attr('data-countdown');
$el.countdown(finalDate, function (event) {
$(this).text(event.strftime('%D days %H:%M:%S'));
});
});
}
})
}
出于某种原因,我觉得如果倒数计时器可以在 function populate()
和 ajax 之外,那就更好了,但是由于你的 DOM 解释,它不会工作。也许调用倒计时的额外负担也太微不足道了...
你想做的事情没有什么困难。唯一的规则是您必须确保在 调用插件之前将 endTime
元素添加到 DOM 。
您需要将 HTML 元素添加到插件将绑定到的模板中。另外,我不知道 endTime
是什么,因为你没有包含你的数据结构。我将假设一个更简单的数据结构——一个结束时间字符串数组:
var endTimes = [
'2017/01/01',
'2018/02/02',
'2019/03/03'
];
我们需要一种方法来获取调用插件时每个倒计时元素的最终日期。我将通过向模板中的元素添加数据属性 data-countdown
来实现这一点:
<script type="mustache/x.tmpl" id="helloTmpl">
{{#each this}}
<div data-countdown="{{.}}"></div>
{{/each}}
</script>
将所有倒计时元素添加到 DOM 后,我们就可以调用插件了。我们将遍历每个具有 data-countdown
属性的元素,从该属性中获取 finalDate
值,然后为该元素调用插件:
var template = Handlebars.compile($('#helloTmpl').html());
$('#Container').html(template(endTimes));
$('[data-countdown]').each(function (index, el) {
var $el = $(el);
var finalDate = $el.attr('data-countdown');
$el.countdown(finalDate, function (event) {
$(this).text(event.strftime('%D days %H:%M:%S'));
});
});
这是一个example in a fiddle.
使用 Final Countdown Plugin and Handlebars.js.
这两个插件单独运行都很好。下面的<div>
会给我倒计时(这里倒计时到2017/01/01):
<div id="getting-started"></div>
<script type="text/javascript">
$("#getting-started").countdown("2017/01/01", function(event) {
$(this).text(
event.strftime('%D days %H:%M:%S')
);
});
</script>
我这里有一个简单的把手示例:
<script type ="mustache/x.tmpl" id="helloTmpl">
{{#each this}}
{{endTime}}
{{/each}}
</script>
其中 {{endTime}}
是我想要倒计时的结束时间(而不是 2017/01/01)。它在 {{#each}}
循环内并且会有 运行 很多 {{endTime}}
.
有人知道使这成为可能的想法吗?并为每个 {{endTime}}
倒计时?我试图把上面的倒计时插件放到一个帮助程序中,但没有成功,而且变得有点乱。提前致谢。
编辑:结果
感谢@76484。通过对您的示例感到困惑,我现在可以使用我的设置,太棒了!我 运行 function populate()
每 3-5 秒用新数据刷新我的模板。这意味着我还必须每 3-5 秒 运行 倒计时功能,即使 endTime
数据没有改变。我喜欢这样:
function populate()
{
var url = apiurl + 'api/myGreatData';
$.ajax
({
type: 'POST',
cache: false,
url: url,
dataType: 'json',
success: function (response)
{
var source = document.getElementById("helloTmpl").innerHTML;
var tmpl= Handlebars.compile(source);
var html = tmpl(response);
var box = document.getElementById("box");
box.innerHTML = html;
// Countdown Timer
$('[data-countdown]').each(function (index, el) {
var $el = $(el);
var finalDate = $el.attr('data-countdown');
$el.countdown(finalDate, function (event) {
$(this).text(event.strftime('%D days %H:%M:%S'));
});
});
}
})
}
出于某种原因,我觉得如果倒数计时器可以在 function populate()
和 ajax 之外,那就更好了,但是由于你的 DOM 解释,它不会工作。也许调用倒计时的额外负担也太微不足道了...
你想做的事情没有什么困难。唯一的规则是您必须确保在 调用插件之前将 endTime
元素添加到 DOM 。
您需要将 HTML 元素添加到插件将绑定到的模板中。另外,我不知道 endTime
是什么,因为你没有包含你的数据结构。我将假设一个更简单的数据结构——一个结束时间字符串数组:
var endTimes = [
'2017/01/01',
'2018/02/02',
'2019/03/03'
];
我们需要一种方法来获取调用插件时每个倒计时元素的最终日期。我将通过向模板中的元素添加数据属性 data-countdown
来实现这一点:
<script type="mustache/x.tmpl" id="helloTmpl">
{{#each this}}
<div data-countdown="{{.}}"></div>
{{/each}}
</script>
将所有倒计时元素添加到 DOM 后,我们就可以调用插件了。我们将遍历每个具有 data-countdown
属性的元素,从该属性中获取 finalDate
值,然后为该元素调用插件:
var template = Handlebars.compile($('#helloTmpl').html());
$('#Container').html(template(endTimes));
$('[data-countdown]').each(function (index, el) {
var $el = $(el);
var finalDate = $el.attr('data-countdown');
$el.countdown(finalDate, function (event) {
$(this).text(event.strftime('%D days %H:%M:%S'));
});
});
这是一个example in a fiddle.