钥匙要点
- >本文介绍了如何使用Node.js构建电池可视化服务的客户端部件,该服务在不重新加载页面的情况下定期更新电池状态。客户可以暂停或恢复更新,以避免在不需要信息时使系统重载。 >
- 反应性设计和声明框架用于自动有效地更新文档对象模型(DOM),以响应数据的变化。这是使用ractive.js来实现的,ractive.js是一个将数据绑定到DOM元素并每次数据更改时都会更新DOM的库。 >作者演示了如何使用ractive.js创建电池可视化,包括设置暂停/简历更新的机制,并从静止服务中异步检索数据。
- > >本文以一个呼吁结束,以进一步探索所讨论的工具和概念,例如使用node.js设置http服务器,RESTFULE API,在Node.js服务器上运行OS终端命令以及声明框架的基础知识和ractive.js。
- 在这个迷你系列的第一部分中,我们讨论了我们正在构建的服务的细节以及您将学到的东西。然后,我们介绍了为什么我们需要服务器以及为什么我选择创建RESTFUL服务的原因。在讨论如何开发服务器时,我借此机会讨论了如何识别当前操作系统以及如何使用node.js在其上运行命令。 在本系列的第二个也是最后一部分中,您将发现如何以不错的方式构建客户部分以向用户提供信息。为了实现此目标,我们应该每x分钟(或秒)更新电池状态,而无需重新加载页面。此外,我们应该能够暂停/简历更新,以避免在不需要信息时泛滥到我们的系统,甚至当我们不查看页面时。为此,我们将:
- >安排Ajax通过常规时间间隔来打电话给我们的后端服务;
- >使用一个声明的框架,该框架会自动有效地对数据的更改进行自动更新;
> 使用一些jQuery效用功能使我们的生活更轻松; - > >使用一些不错的图像和CSS使仪表板视觉吸引人(作为奖励!)。
- 。
反应性设计
讨论Ajax和异步电话肯定不在本文的范围之内(我将在帖子结尾提供一些有用的链接)。出于我们的目的,我们甚至可以将它们视为黑匣子,使我们可以向服务器询问一些数据,并在将数据发送回数据后执行某些操作。 相反,让我们花一点时间讨论反应性设计和声明性框架。 HTML页面默认是静态实体。这意味着,对于纯HTML页面,每次在浏览器中渲染时,页面上显示的内容保持不变。但是,我们知道,通过使用JavaScript以及一些模板库(例如Mustache),我们可以动态更新它们。 有许多库可以帮助开发人员将数据绑定到DOM节点。他们中的大多数使用JavaScript来描述应转换数据的DOM元素,并需要对页面进行更新,以手动触发(通过JavaScript)。因此,我们最终依靠应用程序的逻辑来确定应何时更新可视化以及应对数据更改应进行的更改。 声明框架将数据绑定到DOM元素,并在数据更改时自动更新DOM。还使用演示文稿中的模板(HTML标记)而不是JavaScript中的模板提供了这种绑定。 这些框架的附加值可以在几个关键点中标识:-
他们在内容和呈现之间实施更大程度的分离。这是通过让您在演示层中定义数据,事件处理程序甚至视图的结构(例如迭代和复合对象,例如表);
- >他们提供了一种简单的方法,可以使您的数据模型和您的演示文稿保持同步;
> ractive.js
对于ractive.js,我们将要使用的库,数据和DOM之间的同步是通过>容器对象获得的。该库创建对象围绕数据包裹的对象。这些对象可以访问数据,因此每次您设置或获取任何属性时,库都可以捕获您的操作并内部广播给所有订户。 >动手 现在,我们已经看到了什么是ractive.js有用的,现在该将我们的第一个ractive模板添加到我们的页面了。为此,您可以在内的任何位置添加带有您选择的ID的脚本标签。我建议您明智地选择ID,因为我们以后需要它。我们还需要添加类型='text/ractive'属性:type ='text/ractive' 实际上,对您的浏览器没有任何意义,因为除非您也将ractive的脚本添加到页面上,否则它会忽略脚本:
现在,在RACTIVE脚本内部,您可以添加HTML标签,模板变量以及条件/循环。 ractive.js将负责评估{{}}组内的所有内容。<span><span><span><script> id<span >='meterVizTemplate'</script></span> type<span>='text/ractive'</span>></span><span><span></span>></span></span>在上面的示例中,您可以看到:
<span><span><span><script> src<span >='http://cdn.ractivejs.org/latest/ractive.js'</script></span>></span><span><span></span>></span></span>
<span><span><span><script> id<span >='meterVizTemplate'</script></span> type<span>='text/ractive'</span>></span><span> </span></span><span><span> <span>{{#batteryState}} </span></span></span><span><span> <span><br> </span></span></span><span><span> <span><div class="battery-div"> <span><span> <span><div class="battery-shell"> <span><span> <span><div class="battery-percent-text">{{batteryPercent.toFixed(1) + '%'}}</div> </span></span></span><span><span> <span></span></span></span> </div> </span></span></span><span><span> <span><div class="battery-level"> <span><span> <span><div class="battery-mask" style="width:{{(100 - batteryPercent) + '%'}};"> <span><span> <span></span></span></span> </div> </span></span></span><span><span> <span></span></span></span> </div> </span></span></span><span><span> <span>{{#batteryCharging}} </span></span></span><span><span> <span><div class="battery-plug" intro-outro="fade:1000"></div> </span></span></span><span><span> <span>{{/batteryCharging}} </span></span></span><span><span> <span>{{#batteryPercent </span></span><span><span> <span><div class="battery-warning" intro-outro="fade:1000"></div> </span></span></span><span><span> <span>{{/batteryLife}} </span></span></span><span><span> <span></span></span></span></span> </div> </span></span></span><span><span> <span><br> </span></span></span><span><span> <span><br> </span></span></span><span><span> <span><span class="key">Battery state:</span> <span class="value {{batteryStateClass(batteryState)}}">{{batteryState}}</span> </span></span></span><span><span> <span><br> </span></span></span><span><span> <span>{{#batteryLife}} </span></span></span><span><span> <span><span class="key">Time to empty:</span> <span class="value {{batteryLifeClass(batteryPercent)}}">{{batteryLife}}</span> </span></span></span><span><span> <span>{{/batteryLife}} </span></span></span><span><span> <span>{{/batteryState}} </span></span></span><span><span> <span>{{^batteryState}} </span></span></span><span><span> <span><br> </span></span></span><span><span> <span>LOADING... </span></span></span><span><span> <span>{{/batteryState}} </span></span></span><span><span></span><span><span></span>></span></span>>变量:{{{电池state}}
- 条件:{{#batterystate}}}
- >函数召唤:{{{BattuctStateClass(Battertstate)}}}
<span><span><span><script> id<span >='meterVizTemplate'</script></span> type<span>='text/ractive'</span>></span><span><span></span>></span></span>我们传递给构造函数的选项非常重要。首先,EL需要匹配ractive.js内部的DOM元素的ID。在这种情况下,我们需要添加一个Div到OUT HTML页面:
<span><span><span><script> src<span >='http://cdn.ractivejs.org/latest/ractive.js'</script></span>></span><span><span></span>></span></span>您插入此标签的点很重要。对于ractive.js模板系统呈现的所有元素,它将是parent 元素。您必须谨慎的第二个重要参数是模板。它的值必须匹配页面上文本/ractive脚本的ID。最后,我们将键是我们在模板中引用的变量名称或我们调用的函数的对象。 使用ractive.js,我们甚至可以定义库将回应的自定义事件:
<span><span><span><script> id<span >='meterVizTemplate'</script></span> type<span>='text/ractive'</span>></span><span> </span></span><span><span> <span>{{#batteryState}} </span></span></span><span><span> <span><br> </span></span></span><span><span> <span><div class="battery-div"> <span><span> <span><div class="battery-shell"> <span><span> <span><div class="battery-percent-text">{{batteryPercent.toFixed(1) + '%'}}</div> </span></span></span><span><span> <span></span></span></span> </div> </span></span></span><span><span> <span><div class="battery-level"> <span><span> <span><div class="battery-mask" style="width:{{(100 - batteryPercent) + '%'}};"> <span><span> <span></span></span></span> </div> </span></span></span><span><span> <span></span></span></span> </div> </span></span></span><span><span> <span>{{#batteryCharging}} </span></span></span><span><span> <span><div class="battery-plug" intro-outro="fade:1000"></div> </span></span></span><span><span> <span>{{/batteryCharging}} </span></span></span><span><span> <span>{{#batteryPercent </span></span><span><span> <span><div class="battery-warning" intro-outro="fade:1000"></div> </span></span></span><span><span> <span>{{/batteryLife}} </span></span></span><span><span> <span></span></span></span></span> </div> </span></span></span><span><span> <span><br> </span></span></span><span><span> <span><br> </span></span></span><span><span> <span><span class="key">Battery state:</span> <span class="value {{batteryStateClass(batteryState)}}">{{batteryState}}</span> </span></span></span><span><span> <span><br> </span></span></span><span><span> <span>{{#batteryLife}} </span></span></span><span><span> <span><span class="key">Time to empty:</span> <span class="value {{batteryLifeClass(batteryPercent)}}">{{batteryLife}}</span> </span></span></span><span><span> <span>{{/batteryLife}} </span></span></span><span><span> <span>{{/batteryState}} </span></span></span><span><span> <span>{{^batteryState}} </span></span></span><span><span> <span><br> </span></span></span><span><span> <span>LOADING... </span></span></span><span><span> <span>{{/batteryState}} </span></span></span><span><span></span><span><span></span>></span></span>在几行中,我们设置了一种机制来暂停/恢复我们的更新。但是,我们仍然需要定义updatebatterystatus() 功能。
异步检索数据
如所承诺的,这是一个功能,可以照顾从我们的休息服务中检索数据。通过使用jQuery延期对象,我们设置了一个回调,一旦从服务器收到某些数据,就会被调用。由于我们还在此回调中使用ractive.js,因此我们不必仔细研究如何更新演示层的逻辑。实际上,我们只是更新模板脚本中使用的变量的值,ractive.js将负责所有内容。 我刚刚描述的是由下面报告的代码实现的:ractive <span>= new Ractive({ </span> <span>el: 'panels', </span> <span>template: '#meterVizTemplate', </span> <span>data: { </span> <span>// Percentage at which the battery goes to 'red' zone (export for Ractive templates) </span> <span>batteryRedThreshold: BATTERY_RED_THRESHOLD, </span> <span>// Percentage at which the battery enters 'yellow' zone (export for Ractive templates) </span> <span>batteryYellowThreshold: BATTERY_YELLOW_THRESHOLD, </span> <span>// The capacity of the battery, in percentage. Initially empty </span> <span>batteryPercent: NaN, </span> <span>// How much more time can the battery last? </span> <span>batteryLife: "", </span> <span>// True the update daemon for the battery has been paused </span> <span>batteryPaused: false, </span> <span>// True the update daemon for the battery has reported an error at its last try </span> <span>batteryUpdateError: false, </span> <span>// Is the battery connected to power? </span> <span>batteryCharging: false, </span> <span>batteryStateClass: function (state) { </span> <span>return state === 'discharging' ? BATTERY_RED_CLASS : BATTERY_GREEN_CLASS; </span> <span>}, </span> <span>batteryLifeClass: function (percent) { </span> <span>return percent <span>} </span> <span>} </span><span>});</span></span>
将它们全部放在一起
当然,还有更多的接线可以将所有这些连接在一起。我们完全跳过了仪表板UX的设计。最终,这取决于您,一旦您获得了如何使其与模板系统一起使用!例如,如果我们可以使用图像和动画将充电百分比显示为文本,并且在视觉上以某些凉爽的功率指示器显示为文本和视觉上,那会有多酷?使用ractive.js,这并不难!看看最终结果:
结论
我们的多平台电池仪表板现在应该准备就绪。但这应该是一个起点,而不是最终结果,我希望您在此过程中了解到的重要一点是:- 如何使用node.js 设置HTTP服务器
- > RESTFUL API
- >如何在node.js服务器上运行OS终端命令
- 声明框架和ractive.js的基础知识尤其
- 建筑风格和基于网络的软件体系结构的设计
- >创建RESTFUL API 的指南
- 在本机库中使用REST API的优点/缺点是什么? 模板方法模式
- JavaScript中的异步请求
- >克罗克福德(Crockford)在JavaScript上 - 第四集:Ajax的变态 - 像往常一样的洞察力,以及关于Ajax一词起源的超级有趣的故事,作为奖励! >
- > jQuery $ .getjson方法
- ractivejs教程
- >常见问题(常见问题解答)关于使用node.js客户端创建电池可视化的问题
navigator.getBattery()。然后(function(battery){
console.log(“电池级别:“电池级别:“电池)。 );
});
此代码将当前的电池电量记录到控制台。
如何可视化电池状态数据?
为了可视化电池状态数据,您可以使用任何JavaScript图表库,例如Chart.js或d3.js。这些库允许您从数据中创建各种类型的图表和图形。您还可以使用HTML和CSS创建一个简单的栏或饼图。
>我可以在所有设备上获取电池状态吗?
>电池状态API受到大多数现代浏览器的支持,但是不是全部。还值得注意的是,某些设备(例如台式计算机)可能无法提供准确或任何电池状态信息。>
>如何处理电池状态更改?
您可以通过将事件侦听器添加到电池管理器对象中来处理电池状态更改。电池状态API提供了多个事件,例如“ ChargingChange”,“ LevelChange”,“ ChargingTimeChange”和“ AnergingTimeChange”。这是如何使用这些事件的一个示例:
navigator.getBattery()。然后(function(Batterion){
battery.addeventlistener('levelChange',function',function(){
console。 log(“电池级别:”电池级*100“%”);
});
});
>
如果不支持电池状态API,那么您没有什么可以做的来获得电池状态。您可以使用功能检测来检查是否支持API,并为用户提供替代功能或消息。以上是使用node.js创建电池:客户端的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。 1.Python以简洁语法和丰富库生态着称,适用于数据分析和Web开发。 2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

JavaScript不需要安装,因为它已内置于现代浏览器中。你只需文本编辑器和浏览器即可开始使用。1)在浏览器环境中,通过标签嵌入HTML文件中运行。2)在Node.js环境中,下载并安装Node.js后,通过命令行运行JavaScript文件。

如何在Quartz中提前发送任务通知在使用Quartz定时器进行任务调度时,任务的执行时间是由cron表达式设定的。现�...

在JavaScript中如何获取原型链上函数的参数在JavaScript编程中,理解和操作原型链上的函数参数是常见且重要的任�...

在微信小程序web-view中使用Vue.js动态style位移失效的原因分析在使用Vue.js...

在Tampermonkey中如何对多个链接进行并发GET请求并依次判断返回结果?在Tampermonkey脚本中,我们经常需要对多个链...


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Dreamweaver CS6
视觉化网页开发工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

禅工作室 13.0.1
功能强大的PHP集成开发环境