riot.js學習【八】觀察者
因為Riot是基於自訂標籤【元件】開發的。標籤內部的所有屬性和方法,都是私有的,而外部要存取標籤內容,就顯得有些困難重重。
如果愣是要訪問標籤裡的內容,有幾種吃力不討好的方法:
1、window全局變數法
[code]<script type="riot/tag"> <todo> <h1 id="nbsp-title-nbsp">{ title }</h1> this.title = opts.title || "da宗熊"; // window.TODO劫持现在的this对象 window.TODO = this; </todo> </script>
內容。
缺點:
當頁面有多個相同標籤時,不適用
2、riot.mount回傳值
[code]<script type="riot/tag"> <todo> <h1 id="nbsp-title-nbsp">{ title }</h1> this.title = opts.title || "da宗熊"; </todo> </script> <script> // 这个todo,返回的是个数组!!! var todo = riot.mount("todo"); // todo = [tag]; </script>
riot.mount回傳的,是個數組,要取得第一個「todo」標籤的內容,需要這樣: var todo1 = todo[0];優點:
有辦法區分多個標籤
缺點:
與自訂標籤放置的順序要嚴重的依賴關係。而且透過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之類的工具。

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...
