riot.js学习【八】观察者
因为Riot是基于自定义标签【组件】开发的。标签内部的所有属性和方法,都是私有的,而外部要访问标签内容,就显得有些困难重重。
如果愣是要访问标签里的内容,有几种吃力不讨好的方法:
1、window全局变量法
[code]<script type="riot/tag"> <todo> <h1>{ title }</h1> this.title = opts.title || "da宗熊"; // window.TODO劫持现在的this对象 window.TODO = this; </todo> </script>
优点:
非常暴力简单,通过 window.TODO能访问标签内容的所有内容。
缺点:
当页面有多个相同标签时,不适用
2、riot.mount返回值
[code]<script type="riot/tag"> <todo> <h1>{ title }</h1> this.title = opts.title || "da宗熊"; </todo> </script> <script> // 这个todo,返回的是个数组!!! var todo = riot.mount("todo"); // todo = [tag]; </script>
优点:
有办法区分多个标签
缺点:
与自定义标签放置的顺序要严重的依赖关系。而且通过script的src加载回来的自定义标签,返回值是null。
只有手动调用加载方法,编译之后,才能访问到上下文 :
[code]riot.compile("todo.tag", function(){ /*才能获取到返回的内容*/ var todo = riot.mount("todo")[0]; });
riot.observable
上面的,都并不是王道,在Riot中,内置了发布者,我们只需要通过简单的代码,就能创建一个类jQuery的发布者:
[code]var opts = riot.observable({ // some code... });
通过riot.observable生成的发布者,有 on, off, trigger, one等常用方法【熟悉jq的同学,看名字应该知道怎么回事了】。
那opts为例,这里对各个方法简要说明:
[code]// 监听事件 opts.on("event1", function(data1, data2){ // 监听event1事件 // data1和data2是trigger传入的参数 // data1 = 1, data2 = 2 console.log(data1, data2); }); // 发布一个事件 // 该事件带有 1和2 作为参数 // 上面的on("event1")的回调fn将会执行 opts.trigger("event1", 1, 2); // 解除event1 的所有监听,第二个参数可选 // 如果有第二个参数[function],则只解绑该函数 opts.off("event1"); // one与on类似,只是one如果执行过一次,就自动解除绑定 opts.one("event1", function(data1){ console.log(data1); }); opts.trigger("event1", 1, 2);
最终的输出,将会是:
[code]1 2 1
Riot推崇我们使用 opts 和 observable 解决内外通讯的问题。看个例子:
[code]<!Doctype html> <html> <head> <meta charset="utf-8" /> <title>Riot.js 事件监听</title> <script type="text/javascript" src="riot.js"></script> <script type="text/javascript" src="compiler.js"></script> </head> <body> <todo></todo> </body> <script type="riot/tag"> <todo> <a href="javascript:;" onclick={ opts.login }>登录</a> opts.on("outside", function(value){ console.log("outside value:" + value); }); </todo> </script> <script type="text/javascript"> var opts = riot.observable({ login: function(params){ // 这里的this被todo更改了.. opts.trigger("outside", "登录成功..."); } }); riot.mount("todo", opts); </script> </html>
点击登录后,效果如下:
通过事件监听和发布,能很好的接触内外通讯的问题,同时,也可
以很大程度上,限制某些数据的访问权限。
不过,opts很大程度上,和标签耦合到一起了。
标签需要知道opts将会发布“outside”,并监听;
opts则需要知道标签将会调用它的 login 方法;
如果没有良好的团队规范,这将会是一场灾难。
SO:
无论哪种模式,哪种方法,都有自己的适用场景。用对了,就是画龙点睛,用错了,那是寸步难行。动手前多想想吧
以上就是riot.js学习【八】观察者的内容,更多相关内容请关注PHP中文网(www.php.cn)!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

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

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

本文讨论了在浏览器中优化JavaScript性能的策略,重点是减少执行时间并最大程度地减少对页面负载速度的影响。

本文讨论了使用浏览器开发人员工具的有效JavaScript调试,专注于设置断点,使用控制台和分析性能。

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

本文说明了如何使用源地图通过将其映射回原始代码来调试JAVASCRIPT。它讨论了启用源地图,设置断点以及使用Chrome DevTools和WebPack之类的工具。

深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...

掌握了入门级TypeScript教程后,您应该能够在支持TypeScript的IDE中编写自己的代码,并将其编译成JavaScript。本教程将深入探讨TypeScript中各种数据类型。 JavaScript拥有七种数据类型:Null、Undefined、Boolean、Number、String、Symbol(ES6引入)和Object。TypeScript在此基础上定义了更多类型,本教程将详细介绍所有这些类型。 Null数据类型 与JavaScript一样,TypeScript中的null
