首頁  >  文章  >  web前端  >  riot.js學習【八】觀察者

riot.js學習【八】觀察者

黄舟
黄舟原創
2017-01-16 16:22:201223瀏覽

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

內容。

缺點: 

當頁面有多個相同標籤時,不適用

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>

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>

點擊登入後,效果如下:

riot.js學習【八】觀察者透過事件監聽和發布,能很好的接觸內外通訊的問題,同時,也可

以很大程度上,限制某些資料的存取權限。

不過,opts很大程度上,和標籤耦合在一起了。

標籤需要知道opts將會發布“outside”,並監聽; 

opts則需要知道標籤將會調用它的 login 方法;

如果沒有良好的團隊規範,這將會是一場災難。

SO: 

無論哪一種模式,哪一種方法,都有自己的適用場景。用對了,就是畫龍點睛,用錯了,那是寸步難行。動手前多想想

以上就是riot.js學習【八】觀察者的內容,更多相關內容請關注PHP中文網(www.php.cn)!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn