Knockout js如何实现倒计时
Knockout js how to Implement Countdown Timer
我是Knockout js的新手。尝试使用敲除js 在html上实现倒计时定时器
为此,我在视图中添加了4个html元素(输入、跨度和开始、停止按钮)。当按下启动按钮时,写入<input>
对象的值应该传递给refreshViewModel
,并且会有倒计时过程。当倒计时正在处理时,剩余时间将显示在<span>
元素内。如果按下停止按钮,倒计时将停止。
如果倒计时结束,将启动另一个函数(从另一个viewModel调用),该函数正在用一些参数过滤页面。
将文本框值绑定到范围值。我不知道如何动态地计算和显示跨度内的剩余值?
Html:
<div id="pnlTimer" class="row">
<div class="span2 pull-right" style="border:1px solid rgb(218, 218, 218)" >
<span style="font-weight:bold">Reload Interval</span>
<br />
<input id="initialTime" style="width:20px;height:14px" data-bind="value: initialTime" />
<span id="remainingTime" style="visibility:hidden"> / 15</span> second(s)
<button class="btn" style="margin-top:5px" id="StartCounter" data-bind="click: StartCounter">
<i class="icon-play"></i>
</button>
<button style="visibility:hidden;margin-top:5px;margin-left:-44px" class="btn" id="StopCounter" data-bind="click: StopCounter">
<i class="icon-stop"></i>
</button>
</div>
</div>
Js:
@Url.Content("~/Content/App/viewModels/listCasesViewModel.js
@Url.Content("~/Content/App/viewModels/RefreshPageTimerViewModel.js
$(document).ready(function () {
var viewModel = new ListCasesViewModel();
viewModel.init();
var pnl = $("#pnlFilterPanel").get()[0];
ko.applyBindings(viewModel, pnl);
var viewModelTimer = new RefreshPageTimerViewModel();
viewModelTimer.init();
var pnlTimer = $("#pnlTimer").get()[0];
ko.applyBindings(viewModelTimer, pnlTimer);
viewModelTimer.callBackMethod = viewModel.filter;
});
第一视图模型:RefreshPageTimerViewModel:
var RefreshPageTimerViewModel = function () {
var self = this;
self.StartCounter = ko.observable();
self.StopCounter = ko.observable();
self.initialTime = ko.observable();
self.remainingTime = ko.computed(function () {
return self.initialTime();
}, self);
countDown: ko.observable()
this.init = function () {
self.Count();
}
this.callBackMethod = function () {
alert("not implemented!");
}
this.Count = function () {
var initial = self.initialTime; // initialTime value;
var remaining = self.remainingTime;
if (remainingTime <= 0) {
this.ExecuteCallBackMethod();
}
}
this.ExecuteCallBackMethod = function () {
this.callBackMethod();
}
};
第二视图模型:ListCasesViewModel:
var ListCasesViewModel = function () {
var self = this;
self.selectedStartDate = ko.observable(null);
self.selectedEndDate = ko.observable(new Date());
self.selectedSearchKey = ko.observable("");
self.selectedStatuses = ko.observableArray();
self.selectedHospitals = ko.observableArray();
// methods...
this.init = function () {
self.selectedEndDate(new Date());
self.filter();
}
this.filter = function () {
// get filter control values
var startDate = self.selectedStartDate(); // dtStart.value();
var endDate = self.selectedEndDate(); //dtEnd.value();
var searchText = self.selectedSearchKey();
//And Some calculations....
主要问题是ViewModel代码,它在需要函数(启动和停止计数器)的地方使用了observable
。此外,它似乎没有一个明确的定义,它试图做什么
此外,我假设您希望在计时器停止时显示"开始"按钮,在计时器启动时显示"停止"按钮,所以我也随意添加了此功能。
这是重写后的视图模型:
var RefreshPageTimerViewModel = function () {
var self = this;
self.timerId = 0;
self.elapsedTime = ko.observable(0);
self.initialTime = ko.observable(0);
self.remainingTime = ko.computed(function(){
return self.initialTime() - self.elapsedTime();
});
self.isRunning = ko.observable(false);
self.StartCounter = function(){
self.elapsedTime(0);
self.isRunning(true);
self.timerId = window.setInterval(function(){
self.elapsedTime(self.elapsedTime()+1);
if(self.remainingTime() == 0){
clearInterval(self.timerId);
self.isRunning(false);
self.Callback();
}
},1000)
}
self.StopCounter = function(){
clearInterval(self.timerId);
self.isRunning(false);
}
self.Callback = function(){}
}
需要注意的几点:
具有属性
timerId
,它不需要是可观察的,但允许我们停止用于增加elapsedTime
的计时器具有可观察属性
isRunning
,用于控制启动和停止按钮的可见性具有空函数CCD_ 8,其可用于在倒计时达到零时执行任何函数。
这是新的标记:
<div id="pnlTimer" class="row">
<div class="span2 pull-right" style="border:1px solid rgb(218, 218, 218)" >
<span style="font-weight:bold">Reload Interval</span>
<br />
<input id="initialTime" style="width:20px;height:14px" data-bind="value: initialTime" />
<span id="remainingTime" data-bind="text: remainingTime"></span> second(s)
<button class="btn" style="margin-top:5px" id="StartCounter" data-bind="click: StartCounter, visible: !isRunning()">
start
</button>
<button style="margin-top:5px" class="btn" id="StopCounter" data-bind="click: StopCounter, visible:isRunning()">
Stop
</button>
</div>
</div>
请注意,visible: !isRunning()
添加到启动按钮,visible:isRunning()
添加到停止按钮。
最后,这里是init代码:
$(function(){
var viewModelTimer = new RefreshPageTimerViewModel();
viewModelTimer.Callback = function(){
alert("finished");
};
ko.applyBindings(viewModelTimer);
})
请注意创建了一个回调函数,它只是发出警报。你的代码可以是原样,即viewModelTimer.callBackMethod = viewModel.filter;
最后,举一个可以让你四处玩耍的例子:http://jsfiddle.net/eF5Ec/
- 如何使用动画实现纸张推车
- 客户端服务器REST API captcha实现
- 如何实现此布局
- Meteor忘记了密码的实现
- 如何在窗体打开时从javascript倒计时计时器值中节省时间
- 使用Native Sockets在Android中实现WebSockets
- 在样板文件中实现Ajax
- 设置倒计时计时器,IE出现问题
- instanceof是如何在JavaScript中实现的
- 如何正确实现Jquery多选小部件
- 实现一个建立在google.com之上的自定义搜索引擎
- 多个组件是如何实现的
- window.location使用jquery mobile实现chrome跳转
- 如何在OpenERP中实现网络摄像头
- 显示具有服务器端自动时间注销的同步倒计时计时器
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- 在 php 代码中实现倒计时 js 倒计时
- Knockout js如何实现倒计时
- 如何在JavaScript中实现倒计时和重定向
- Javascript在一个表中实现多个倒计时计时器