avalon1.5+中组件的定义方式
avalon在1.5之后引入新的组件定义和使用方式,其总的宗旨是为了使定义和使用组件更加简单
组件库的概念
首先,需要注意的是,引入了组件库的概念(也可以理解为namespace),之后定义的组件必须指定它属于哪一个组件库。
定义方法很简单,如下:
avalon.library("wk");
上面的定义通常直接放在avalon引用的地方之下。
使用组件
然后假设我们已经有一个该库的组件button,则使用方法如下:(注意我们不再使用ms-widget的绑定了)
<wk:button a="testbutton" config="$buttonOpts"></wk:button>
可以看到,我们可以在声明的同时,直接给属性a赋值,并使用新的关键字config来指定该组件的配置项。
定义组件
直接上代码:
define(['avalon'], function(avalon) {
var _interface = function () {
}
avalon.component("wk:button", {
// VM的属性,并且同时是组件的参数
onInit: _interface,
// 下面是组件的几个特殊事件
$replace: false, // 真值时表示替换其容器
$init: function(vm, elem) {
console.log("button init");
vm.onInit.call(elem, vm);
},
$childReady: function() {
console.log("button childReady");
},
$ready: function() {
console.log("button ready");
},
$dispose: function(vm. elem) {
elem.innerHTML = elem.textContent = ""
console.log("button dispose");
},
$template: "<button type='button'>{{a}} <ms:text></ms:text></button>"
});
return avalon; // 最后必须返回avalon
});
注意点:
- 使用
avalon.component定义组件,不再显示的定义组件的ViewModel - 不再额外定义组件的options和参数
- 增加了监听子组件的初始化完成事件
$childReady
例子, 下面示例pager组件的新的方式定义
模板(注:和之前的定义方式相比,没有任何更改)
<div class="row">
<div class="col-md-5 col-sm-12" style="margin: 10px 0;" ms-if='showPagingInfo'>
<span>第<span style="color: #b70c5e"> {{currentIndex}} / {{totalPage}} </span>页,
每页显示<span style="color: #b70c5e"> {{pageSize}} </span>条记录,
共搜索出<span style="color: #b70c5e"> {{totalCount}} </span>条记录</span>
</div>
<div class="col-md-7 col-sm-12">
<nav style="float: right;">
<ul class="pagination pagination-sm" style="margin:5px 0;">
<li ref="1"><a ms-click="jumpToFirst" href="javascript:;">首页</a></li>
<li ms-class='active: el === currentIndex' ms-repeat='pageIndexs'><a href="javascript:;" ms-click='jump(el)'>{{el}}</a></li>
<li ref="2"><a ms-click="jumpToLast" href="javascript:;">尾页</a></li>
</ul>
</nav>
</div>
</div>
组件代码:
define(['avalon',
'text!components/pager.html'
], function(avalon, sourceHtml) {
var _interface = function() {};
avalon.component("wk:pager", {
showPagingInfo: true,
pageSize: 10,
//分页信息
currentIndex: 1,
totalPage: 1,
totalCount: 1,
pageIndexs: [],
// 事件
onInit: _interface,
onPageChanged: _interface,
// 方法
doInit: _interface,
jump: _interface,
jumpToFirst: _interface,
jumpToLast: _interface,
$replace: true, // 真值时表示替换其容器
$init: function(vm, elem) {
vm.jump = function(toIndex) {
console.log(toIndex);
vm.onPageChanged.call(elem, toIndex);
vm.currentIndex = toIndex;
};
vm.jumpToFirst = function() {
vm.jump(1);
};
vm.jumpToLast = function() {
vm.jump(vm.totalPage);
};
// 初始化方法
vm.doInit = function (pageIndex, pageCount, totalCount, pageSize) {
vm.currentIndex = pageIndex;
vm.totalPage = pageCount;
vm.totalCount = totalCount;
vm.pageSize = pageSize || options.pageSize;
vm.pageIndexs.clear();
for(var i = 1; i <= vm.totalPage; i++){
vm.pageIndexs.push(i);
}
};
vm.onInit.call(elem, vm);
},
$childReady: function() {
},
$ready: function() {
},
$dispose: function(vm, elem) {
elem.innerHTML = elem.textContent = "";
},
$template: sourceHtml
});
return avalon;
});
使用
<wk:pager config="$pagerOpts"></wk:pager>
//在VM中:
$pagerOpts:{
onInit: function (vm) {
vm.doInit(2, 10, 100, 10);
},
onPageChanged: function (index) {
console.log("changed to page " + index);
}
}
注意点:
- 在init中修改$template的方法:
vm.$$template = function () {
return sourceHtml;
};
avalon1.5+中组件的定义方式的更多相关文章
- Java中数组的定义方式
数组定义方式一 动态方式(指定数组的长度) 格式: 数组存储的数据类型[]数组名字 = new 数组存储的数据类型[长度]; [] : 表示数组. 数组名字:为定义的数组起个变量名,满足标识符规范,可 ...
- Vue组件的定义方式
1.使用template标签定义组件 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- Vue学习笔记【23】——Vue组件(组件的定义)
定义Vue组件 什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可: 组件化和模块化的不同: ...
- 038——VUE中组件之WEB开发中组件使用场景与定义组件的方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- UE4 中Struct Emum 类型的定义方式 笔记
UE4 基础,但是不经常用总是忘记,做个笔记加深记忆: 图方便就随便贴一个项目中的STRUCT和 Enum 的.h 文件 Note:虽然USTRUCT可以定义函数,但是不能加UFUNCTION 标签喔 ...
- vue组件定义方式,vue父子组件间的传值
vue组件定义方式,vue父子组件间的传值 <!DOCTYPE html> <html lang="zh-cn"> <head> <met ...
- Vue中组件间通信的方式
Vue中组件间通信的方式 Vue中组件间通信包括父子组件.兄弟组件.隔代组件之间通信. props $emit 这种组件通信的方式是我们运用的非常多的一种,props以单向数据流的形式可以很好的完成父 ...
- React中组件间通信的方式
React中组件间通信的方式 React中组件间通信包括父子组件.兄弟组件.隔代组件.非嵌套组件之间通信. Props props适用于父子组件的通信,props以单向数据流的形式可以很好的完成父子组 ...
- [转] React 中组件间通信的几种方式
在使用 React 的过程中,不可避免的需要组件间进行消息传递(通信),组件间通信大体有下面几种情况: 父组件向子组件通信 子组件向父组件通信 跨级组件之间通信 非嵌套组件间通信 下面依次说下这几种通 ...
随机推荐
- 原生JavaScript生成GUID的实现
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可 ...
- windows下oracle数据库定时备份与压缩批处理脚本(win7/win2008亲测通过)
第一种方式:全备份,并直接覆盖原来的备份文件,固定命名. 脚本: @echo off exp system/a123@HZPG file=e:\db_backup\oradata.dmp log=e: ...
- javascript脚本化文档
1.getElememtById /** * 获取指定id的的元素数组 */ function getElements(/*ids...*/) { var elements = {}; for(var ...
- Cocos2d-x在Android在竖屏切换
在Cocos2d-x在,屏幕类型的默认设置是横屏,当我们需要切换到肖像,能够在项目目录打开proj.android目录.找到AndroidManifest.xml文件,直接打开,然后就可以看到里面:s ...
- Android学习路径——Android的四个组成部分activity(一)
一.什么是Activity? Activity简单的说就是一个接口.我们是Android手机上看到的每个界面就是一个activity. 二.Activity的创建 1.定义一个类继承activity, ...
- Building Modern Web Apps-构建现代的 Web 应用程序
Building Modern Web Apps-构建现代的 Web 应用程序 视频长度:1 小时左右 视频作者:Scott Hunter 和 Scott Hanselman 视频背景:Visual ...
- FileWriter字符输出流和FileReader字符输出流
//FileWriter public class FileWriterDemo { //字符流:适用于文本文件,以字符为单位进行操作,经常和缓冲流一起使用 /** * 字符流操作步骤: * 1. ...
- MVC 控制器
ASP.NET MVC控制器(一) 前言 在路由的篇章中讲解了路由的作用,讲着讲着就到了控制器部分了,从本篇开始来讲解MVC中的控制器,控制器是怎么来的?MVC框架对它做了什么?以及前面有的篇幅所留的 ...
- SQLSERVER数据库学习总结七(视图,索引)
--视图的主意点:不能和表的名称相同,如果某一列为函数,表达式,常量或者与来自多张表的列名相同,必须为列定义名称,不能在试图上创建索引 if exists(select 1 from sys.syso ...
- C#Winform中的一个登录解说(转载的哟,比较不错)
最近,看到网上经常会问如何进行窗口跳转,大多数的问题都是牵扯到Login窗口.其实,在Visual Studio 6以来,比较正确的做法,是判断Login窗口的返回值,然后决定是否打开主窗体,那么在C ...