riot.js学习【八】观察者

因为Riot是基于自定义标签【组件】开发的。标签内部的所有属性和方法,都是私有的,而外部要访问标签内容,就显得有些困难重重。

如果愣是要访问标签里的内容,有几种吃力不讨好的方法:

1、window全局变量法

<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返回值

<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。
只有手动调用加载方法,编译之后,才能访问到上下文 :

riot.compile("todo.tag", function(){ 
    /*才能获取到返回的内容*/
    var todo = riot.mount("todo")[0];
});

riot.observable

上面的,都并不是王道,在Riot中,内置了发布者,我们只需要通过简单的代码,就能创建一个类jQuery的发布者:

var opts = riot.observable({
    // some code...
});

通过riot.observable生成的发布者,有 on, off, trigger, one等常用方法【熟悉jq的同学,看名字应该知道怎么回事了】。

那opts为例,这里对各个方法简要说明:

// 监听事件
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);

最终的输出,将会是:

1 2
1

Riot推崇我们使用 opts 和 observable 解决内外通讯的问题。看个例子:

<!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:
无论哪种模式,哪种方法,都有自己的适用场景。用对了,就是画龙点睛,用错了,那是寸步难行。动手前多想想吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值