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
});

注意点:

  1. 使用avalon.component定义组件,不再显示的定义组件的ViewModel
  2. 不再额外定义组件的options和参数
  3. 增加了监听子组件的初始化完成事件 $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);
}
}

注意点:

  1. 在init中修改$template的方法:
vm.$$template = function () {
return sourceHtml;
};

avalon1.5+中组件的定义方式的更多相关文章

  1. Java中数组的定义方式

    数组定义方式一 动态方式(指定数组的长度) 格式: 数组存储的数据类型[]数组名字 = new 数组存储的数据类型[长度]; [] : 表示数组. 数组名字:为定义的数组起个变量名,满足标识符规范,可 ...

  2. Vue组件的定义方式

    1.使用template标签定义组件 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  3. Vue学习笔记【23】——Vue组件(组件的定义)

    定义Vue组件 什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可: 组件化和模块化的不同: ...

  4. 038——VUE中组件之WEB开发中组件使用场景与定义组件的方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. UE4 中Struct Emum 类型的定义方式 笔记

    UE4 基础,但是不经常用总是忘记,做个笔记加深记忆: 图方便就随便贴一个项目中的STRUCT和 Enum 的.h 文件 Note:虽然USTRUCT可以定义函数,但是不能加UFUNCTION 标签喔 ...

  6. vue组件定义方式,vue父子组件间的传值

    vue组件定义方式,vue父子组件间的传值 <!DOCTYPE html> <html lang="zh-cn"> <head> <met ...

  7. Vue中组件间通信的方式

    Vue中组件间通信的方式 Vue中组件间通信包括父子组件.兄弟组件.隔代组件之间通信. props $emit 这种组件通信的方式是我们运用的非常多的一种,props以单向数据流的形式可以很好的完成父 ...

  8. React中组件间通信的方式

    React中组件间通信的方式 React中组件间通信包括父子组件.兄弟组件.隔代组件.非嵌套组件之间通信. Props props适用于父子组件的通信,props以单向数据流的形式可以很好的完成父子组 ...

  9. [转] React 中组件间通信的几种方式

    在使用 React 的过程中,不可避免的需要组件间进行消息传递(通信),组件间通信大体有下面几种情况: 父组件向子组件通信 子组件向父组件通信 跨级组件之间通信 非嵌套组件间通信 下面依次说下这几种通 ...

随机推荐

  1. 快速构建Windows 8风格应用22-MessageDialog

    原文:快速构建Windows 8风格应用22-MessageDialog 本篇博文主要介绍MessageDialog概述.MessageDialog常用属性和方法.如何构建MessageDialog ...

  2. Ruby on Rails (ROR)类书籍

    Ruby on Rails (ROR)类书籍下载地址及其他(整理) Ruby on Rails 如此之热,忍不住也去看了看热闹,现在把一些相关的电子图书下载地址整理下,方便有兴趣的朋友. 2006-0 ...

  3. 我的Android 4 学习系列之创建用户基本界面

    目录 使用视图和布局 理解Fragment 优化布局 创建分辨率无关的用户界面 扩展.分组.创建和使用视图 使用适配器将数据绑定到视图 使用视图和布局 1. Android UI 几个基本概念 视图: ...

  4. 【转】在PC上测试移动端网站和模拟手机浏览器的5大方法

    查了很多资料,尝试了大部分方法,下面将这一天的努力总结下分享给大家,也让大家免去看那么多文章,以下介绍的方法,都是本人亲自测试成功的方法,测试环境winxp. 一.Chrome*浏览器 chrome模 ...

  5. 在SQL Server中添加Linked Server 图解版

    在开发中,经常需要一个SQL Server服务器去访问另一个服务器,微软提供了一种方式Linked Server 下面是配置流程: 1).打开Server Objects下 Linked Server ...

  6. java 生成easyui 所需要的森林

    在项目中,可能会遇到机构树这种格式,但是数据库存储的数据 不能维护这样子的树,所以需要中间转换来完成,zTree可以支持pid,id,name的格式,但是easyui貌似不行,这里就给出刚刚码好的代码 ...

  7. SQLSERVER 数据库性能的的基本 MVC + EF + Bootstrap 2 权限管理

    SQLSERVER 数据库性能的基本 很久没有写文章了,在系统正式上线之前,DBA一般都要测试一下服务器的性能 比如你有很多的服务器,有些做web服务器,有些做缓存服务器,有些做文件服务器,有些做数据 ...

  8. 常用排序算法的python实现和性能分析

    常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...

  9. DTD

    DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块. 它使用一系列的合法元素来定义文档结构. DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用. 内部的 DOCTYPE 声明 ...

  10. C#打包应用程序

    摘要:本文介绍在C#中手把手教你用C#打包应用程序(安装程序卸载程序) 1:新建安装部署项目 打开VS,点击新建项目,选择:其他项目类型->安装与部署->安装向导(安装项目也一样),然后点 ...