因為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)!

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

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表達式設定的。現�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

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

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。