使用 Knockout 在 Durandal JS 框架中添加和 运行 JQuery
Add and run JQuery in Durandal JS framework using Knockout
在 ViewModel 中 运行 宁 JQuery 代码并在 View 中执行代码有困难。环境是 运行 使用 Durandal JS 框架。不幸的是,从简单的 alert('Hello?')
到 运行ning 60 秒计时器,任何东西都不起作用。计时器停留在 59:59。 JQuery 代码的 None 是 working/running。甚至不是一个简单的 $('h1').css('color','red');
。
如何在 Durandal/Knockout 视图中 运行 JQuery?这是我尝试在我的视图中使用的功能计时器示例。
shell.html
计时器位于页脚下方,带有重置按钮。
<div class="wrapper">
<!-- navigation -->
<nav>
<div class="container">...</div>
</nav>
<!-- end: navigation -->
<!-- body -->
<div class="container page-host" data-bind="router: { transition:'entrance' }"></div>
<!-- end: body -->
<!-- footer -->
<footer>
<div class="container">
<div class="row">
<div class="col-xs-12">...</div>
</div>
</div>
</footer>
<!-- end: footer -->
<!-- timer -->
<div class="timer affix-top" data-spy="affix" data-offset-top="50">
<span id="countdown">59:59</span>
<p id="reset" tabindex="0">
<strong class="hidden-sm hidden-xs">Click here to reset timer</strong>
<strong class="hidden-lg hidden-md">Reset timer</strong>
</p>
</div>
<!-- end: timer -->
</div>
shell.js
JQuery 代码需要放在这里,但我尝试过的所有方法都不起作用。下面是JQuery定时器的运行代码。
define(['plugins/router', 'durandal/app'], function (router, app) {
return {
router: router,
search: function() {
//It's really easy to show a message box.
//You can add custom options too. Also, it returns a promise for the user's response.
app.showMessage('Search not yet implemented...');
},
activate: function () {
router.map([
{ route: '', title:'Page Title', moduleId: 'viewmodels/setup', nav: true },
{ route: 'setup', moduleId: 'viewmodels/setup', nav: true },
{ route: 'review', moduleId: 'viewmodels/review', nav: true }
]).buildNavigationModel();
return router.activate();
}
};
});
JQuery 代码(60 秒定时器)
这是我要插入 shell.js 以在页面上显示计时器的代码。
// TIMER: COUNTDOWN FROM 60 MINUTES WHEN PAGE IS LOADED
$(document).ready(function() {
function countdown(element, minutes, seconds) {
var time = minutes * 60 + seconds; // CREATE VARIABLE: SET TO 60 MINUTES (FOR ONE HOUR)
var interval = setInterval(function() {
var el = document.getElementById(element);
$('#timer_ok, #timer_cancel, #dialog_overlay').on('click keypress', function() {
$('#dialog').fadeOut(300);
$('#dialog_overlay').fadeOut(300);
});
$(document).keyup(function(e) {
// WHEN CLICKING "ESC" KEY CLOSE DIALOG WINDOW
if (e.keyCode == 27) {
$('#dialog').fadeOut(300);
$('#dialog_overlay').fadeOut(300);
}
});
// WHEN CLICKED, RESET THE TIMER...
$("#reset").on('click keypress', function() {
time = 3600; // SET TIME TO 60 MINUTES
});
var minutes = Math.floor(time / 60);
if (minutes < 10) minutes = "0" + minutes;
var seconds = time % 60;
if (seconds < 10) seconds = "0" + seconds;
var text = minutes + ':' + seconds;
el.innerHTML = text;
time--;
}, 1000);
}
countdown('countdown', 60, 00); // START THE TIMER INSIDE THE ELEMENT ('ID', MINUTES, SECONDS)
});
main.js
我们正在使用 RequireJS 来 运行 插件。添加这个以防有必要确定如何在 shell.js 文件中调用 JQuery。
requirejs.config({
paths: {
'text': '../vendor/require/text',
'durandal':'../vendor/durandal/js',
'plugins' : '../vendor/durandal/js/plugins',
'transitions' : '../vendor/durandal/js/transitions',
'knockout': '../vendor/knockout/knockout-3.4.0',
'bootstrap': '../vendor/bootstrap/js/bootstrap',
'jquery': '../vendor/jquery/jquery-1.9.1'
},
shim: {
'bootstrap': {
deps: ['jquery'],
exports: 'jQuery'
}
}
});
define(['durandal/system', 'durandal/app', 'durandal/viewLocator', 'bootstrap'], function (system, app, viewLocator) {
//>>excludeStart("build", true);
system.debug(true);
//>>excludeEnd("build");
app.title = 'EV-CIS: Defects and Recalls Reporting';
app.configurePlugins({
router:true,
dialog: true
});
app.start().then(function() {
//Replace 'viewmodels' in the moduleId with 'views' to locate the view.
//Look for partial views in a 'views' folder in the root.
viewLocator.useConvention();
//Show the app by setting the root view model for our application with a transition.
app.setRoot('viewmodels/shell', 'entrance');
});
});
请帮忙。
您可以使用 compositionComplete
生命周期回调来添加您想要在 DOM 准备好后挂接的所有 jquery 功能。
define(['plugins/router', 'durandal/app'], function (router, app) {
return {
router: router,
search: function() { },
activate: function () { },
compositionComplete: function() {
// keep the click, keyup, keypress handlers here, outside setInterval
var minutes = 60, seconds = 0;
var time = minutes * 60 + seconds;
var interval = setInterval(function () {
var el = document.getElementById("countdown");
var minutes = Math.floor(time / 60);
if (minutes < 10) minutes = "0" + minutes;
var seconds = time % 60;
if (seconds < 10) seconds = "0" + seconds;
var text = minutes + ':' + seconds;
el.innerHTML = text;
time--;
}, 1000);
}
};
});
Knockout 具有 keyup
和 click
绑定。因此,您也可以使用它们代替 jquery 事件处理程序。
在 ViewModel 中 运行 宁 JQuery 代码并在 View 中执行代码有困难。环境是 运行 使用 Durandal JS 框架。不幸的是,从简单的 alert('Hello?')
到 运行ning 60 秒计时器,任何东西都不起作用。计时器停留在 59:59。 JQuery 代码的 None 是 working/running。甚至不是一个简单的 $('h1').css('color','red');
。
如何在 Durandal/Knockout 视图中 运行 JQuery?这是我尝试在我的视图中使用的功能计时器示例。
shell.html
计时器位于页脚下方,带有重置按钮。
<div class="wrapper">
<!-- navigation -->
<nav>
<div class="container">...</div>
</nav>
<!-- end: navigation -->
<!-- body -->
<div class="container page-host" data-bind="router: { transition:'entrance' }"></div>
<!-- end: body -->
<!-- footer -->
<footer>
<div class="container">
<div class="row">
<div class="col-xs-12">...</div>
</div>
</div>
</footer>
<!-- end: footer -->
<!-- timer -->
<div class="timer affix-top" data-spy="affix" data-offset-top="50">
<span id="countdown">59:59</span>
<p id="reset" tabindex="0">
<strong class="hidden-sm hidden-xs">Click here to reset timer</strong>
<strong class="hidden-lg hidden-md">Reset timer</strong>
</p>
</div>
<!-- end: timer -->
</div>
shell.js
JQuery 代码需要放在这里,但我尝试过的所有方法都不起作用。下面是JQuery定时器的运行代码。
define(['plugins/router', 'durandal/app'], function (router, app) {
return {
router: router,
search: function() {
//It's really easy to show a message box.
//You can add custom options too. Also, it returns a promise for the user's response.
app.showMessage('Search not yet implemented...');
},
activate: function () {
router.map([
{ route: '', title:'Page Title', moduleId: 'viewmodels/setup', nav: true },
{ route: 'setup', moduleId: 'viewmodels/setup', nav: true },
{ route: 'review', moduleId: 'viewmodels/review', nav: true }
]).buildNavigationModel();
return router.activate();
}
};
});
JQuery 代码(60 秒定时器)
这是我要插入 shell.js 以在页面上显示计时器的代码。
// TIMER: COUNTDOWN FROM 60 MINUTES WHEN PAGE IS LOADED
$(document).ready(function() {
function countdown(element, minutes, seconds) {
var time = minutes * 60 + seconds; // CREATE VARIABLE: SET TO 60 MINUTES (FOR ONE HOUR)
var interval = setInterval(function() {
var el = document.getElementById(element);
$('#timer_ok, #timer_cancel, #dialog_overlay').on('click keypress', function() {
$('#dialog').fadeOut(300);
$('#dialog_overlay').fadeOut(300);
});
$(document).keyup(function(e) {
// WHEN CLICKING "ESC" KEY CLOSE DIALOG WINDOW
if (e.keyCode == 27) {
$('#dialog').fadeOut(300);
$('#dialog_overlay').fadeOut(300);
}
});
// WHEN CLICKED, RESET THE TIMER...
$("#reset").on('click keypress', function() {
time = 3600; // SET TIME TO 60 MINUTES
});
var minutes = Math.floor(time / 60);
if (minutes < 10) minutes = "0" + minutes;
var seconds = time % 60;
if (seconds < 10) seconds = "0" + seconds;
var text = minutes + ':' + seconds;
el.innerHTML = text;
time--;
}, 1000);
}
countdown('countdown', 60, 00); // START THE TIMER INSIDE THE ELEMENT ('ID', MINUTES, SECONDS)
});
main.js
我们正在使用 RequireJS 来 运行 插件。添加这个以防有必要确定如何在 shell.js 文件中调用 JQuery。
requirejs.config({
paths: {
'text': '../vendor/require/text',
'durandal':'../vendor/durandal/js',
'plugins' : '../vendor/durandal/js/plugins',
'transitions' : '../vendor/durandal/js/transitions',
'knockout': '../vendor/knockout/knockout-3.4.0',
'bootstrap': '../vendor/bootstrap/js/bootstrap',
'jquery': '../vendor/jquery/jquery-1.9.1'
},
shim: {
'bootstrap': {
deps: ['jquery'],
exports: 'jQuery'
}
}
});
define(['durandal/system', 'durandal/app', 'durandal/viewLocator', 'bootstrap'], function (system, app, viewLocator) {
//>>excludeStart("build", true);
system.debug(true);
//>>excludeEnd("build");
app.title = 'EV-CIS: Defects and Recalls Reporting';
app.configurePlugins({
router:true,
dialog: true
});
app.start().then(function() {
//Replace 'viewmodels' in the moduleId with 'views' to locate the view.
//Look for partial views in a 'views' folder in the root.
viewLocator.useConvention();
//Show the app by setting the root view model for our application with a transition.
app.setRoot('viewmodels/shell', 'entrance');
});
});
请帮忙。
您可以使用 compositionComplete
生命周期回调来添加您想要在 DOM 准备好后挂接的所有 jquery 功能。
define(['plugins/router', 'durandal/app'], function (router, app) {
return {
router: router,
search: function() { },
activate: function () { },
compositionComplete: function() {
// keep the click, keyup, keypress handlers here, outside setInterval
var minutes = 60, seconds = 0;
var time = minutes * 60 + seconds;
var interval = setInterval(function () {
var el = document.getElementById("countdown");
var minutes = Math.floor(time / 60);
if (minutes < 10) minutes = "0" + minutes;
var seconds = time % 60;
if (seconds < 10) seconds = "0" + seconds;
var text = minutes + ':' + seconds;
el.innerHTML = text;
time--;
}, 1000);
}
};
});
Knockout 具有 keyup
和 click
绑定。因此,您也可以使用它们代替 jquery 事件处理程序。