发布于 2015-09-06 14:46:08 | 396 次阅读 | 评论: 0 | 来源: 网络整理
这一小节,我们将实现一个简单的组件—— HelloRegular ,它用来显示友好的用户欢迎语,但是如果用户未登录的话需要提示进行登录信息,为了简单起见只需要输入用户名就可以进行登录.
经过本节学习, 你将会了解:
<div id="app"></div>
<script id="hello" type="text/regular" name="hello">
Hello, Guest
</script>
<!-- 引入regular.js -->
<script src="https://rawgit.com/regularjs/regular/master/dist/regular.js"></script>
<script>
//利用Regular构建你的app吧
var HelloRegular = Regular.extend({
template: '#hello'
});
// initialize component then $inject to #app's bottom
var component = new HelloRegular({
data: {username: "leeluolee"}
});
component.$inject('#app');
</script>
Regular.extend
Regular.extend用来创建一个继承自Regular的组件类,所有传入extend的属性都会成为此组件类的原型属性
template
一般来讲一个组件会需要一个模板来描述组件的结构,这里我们传入包含模板的容器节点的选择器(你也可以直接传入模板字符串)
data
组件component可能需要一些初始化状态,这些数据我们可以在实例化组件时作为data
传入。
需要注意的是在实例化组件传入的参数会被作为实例属性, 所以可以在这里覆盖extend的定义(原型属性)
$inject(node[, direction])
这是个组件的实例方法,会将组件插入到目标节点制定位置
bottom
[默认参数]: 作为node的 lastChild插入top
: 作为node的firstChild 插入after
: 作为node的nextSibling插入before
: 作为previousSibling插入目前为止,这个组件仅仅只是显示了一个静态信息,我们在模板中简单添加一个插值来显示用户信息, 需要注意的是regularjs的内建模板是'活动'的,如果你更新了数据状态, ui将会自动更新。
Hello, {username}
接下来我们处理未登录的用户情况
{#if username}
Hello, {username}.
{#else}
Sorry, Guest.
{/if}
就与常规的字符串模板(例如jst)类似,模板里我们添加if/else
来区分登录用户与游客的显示效果
on-click
这里同时我们添加了两个click事件来处理用户的登录与登出逻辑,
{#if username}
Hello, {username}. <a href="javascript:;" on-click={username = ''}>Logout</a>
{#else}
Sorry, Guest. Please <a href="javascript:;" on-click={this.login()}>Login</a>
{/if}
tips:
regular中
on-
开头的属性会被作为事件绑定处理,每当对应的ui事件触发. 会将传入的表达式运行一次(与angular的事件系统类似). 你可以通过Regular.event
来扩展自定义ui事件,例如on-tap
这种dom中并不原生支持的事件
这里我们添加了两个用户操作:
登出: 由于regular的表达式支持赋值操作,这里的登出我们仅仅是对username做了清空处理。
登录: 模板中的this对象指向实例component本身,我们需要在extend时添加一个原型方法login来处理登录逻辑
var HelloRegular = Regular.extend({
template: '#hello',
login: function(){
var data = this.data; // get data
data.username = prompt("please enter your username", "")
}
});
虽然这个例子非常简单, 但是基本上实现一个组件的思路大同小异