Knockout.js组件系统的详解之(一) - 组件的定义和注册
(Knockout版本:3.4.1 )
KO的组件主要从以下四个部分进行详细介绍:
1.组件的定义和注册
2.组件绑定
3.使用自定义元素
4.自定义组件加载器(高级)
目录结构
1.通过"视图模型"、"模版"配对注册组件
--1.1 指定视图模型的方法
----1.1.1 构造函数
----1.1.2 对象实例
----1.1.3 创造视图模型的工厂函数
----1.1.4 AMD模块,其值描述了一个视图模型
--1.2 指定模版的方法
----1.2.1 已存在元素的ID
----1.2.2 已存在元素的实例
----1.2.3 HTML字符串
----1.2.4 包含许多DOM节点的数组
----1.2.5 文档片段
----1.2.6 AMD模块,其值描述了一个模版
2.Knockout怎样通过AMD加载组件
--2.1 AMD模块为按需加载
3.通过一个AMD模块注册组件
--3.1 推荐的AMD组件模块的定义方式
1.1.1 构造函数
function SomeComponentViewModel(params) {
// 'params' is an object whose key/value pairs are the parameters
// passed from the component binding or custom element.
this.someProperty = params.something;
}
SomeComponentViewModel.prototype.doSomething = function() { ... };
ko.components.register('my-component', {
viewModel: SomeComponentViewModel,
template: ...
});
Knockout将会调用这个构造函数并生成一个实例作为视图模型,其中params参数在组件调用的时候传入。
1.1.2 对象实例
直接传递一个对象实例作为视图模型,所有使用这个对象的组件共享这一个实例。假定对象实例为modelInstance,注意传入方法为:viewModel: {instance: modelInstance}
1.1.3 创造视图模型的工厂函数
如果创建这个视图模型需要取得一些组件调用的信息,那么就采取这从模式定义视图模型。
ko.components.register('my-component', {
viewModel: {
createViewModel: function(params, componentInfo) {
// - 'params'是组件调用时传入的对象
// - 'componentInfo.element'是组件注入的元素,当createViewModel方
// 法被调用时,组件已被注入到元素中,但还没有发生绑定。
// - 'componentInfo.templateNodes'是一个包含了组件调用时内部的DOM节
// 点的数组。
// 通过自己定义的构造函数返回一个实例
return new MyViewModel(params);
}
},
template: ...
});
注意,操作DOM最好只通过自定义绑定,而不要通过componentInfo.element进行一些操作DOM的行为。
componentInfo.templateNodes在我们需要控制组件输出的节点时会起到作用。
1.1.4 通过AMD模块
如果使用了AMD模块加载器,比如(require.js),可以使用模块加载器直接加载AMD模块作为视图模型。
ko.components.register('my-component', {
viewModel: { require: 'some/module/name' },
template: ...
});
加载的AMD模块只要按照1.1.1,1.1.2,1.1.3三种方式中的一种提供模块(即returns)就可以了。另外还有一种一般不会用到的方式AMD模块的return为 return { module: 'some/other/module' },这种方式将会加载其它模块。
1.2.1 已存在元素的ID
<template id='my-component-template'>
<h1 data-bind='text: title'></h1>
<button data-bind='click: doSomething'>Click me right now</button>
</template>
ko.components.register('my-component', {
template: { element: 'my-component-template' },
viewModel: ...
});
指定一个已存在元素的ID即可,ID所对应元素本身不会被作为模版的元素传入,其内部节点会作为模版被传入。推荐使用例子里的< template>标签,别的标签也可以,但浏览器不识别template标签所以它不会被渲染收到影响,另外语义也比较清晰。
1.2.2 已存在元素的实例
类似于传入ID,只是这次传入的是元素实例。
1.2.3 HTML字符串
ko.components.register('my-component', {
template: '<h1 data-bind="text: title"></h1>\
<button data-bind="click: doSomething">Clickety</button>',
viewModel: ...
});
当我们从别处取得一些字符串来生成模版时(比如AMD),这个方法很有用。
1.2.4 包含许多DOM节点的数组
var myNodes = [
document.getElementById('first-node'),
document.getElementById('second-node'),
document.getElementById('third-node')
];
ko.components.register('my-component', {
template: myNodes,
viewModel: ...
});
这些节点会依次作为组件模版被复制渲染出来。
1.2.5 文档片段
1.2.6 AMD模块
可以传一个AMD模块,这个模块的返回值是以上模版的任一种类型都可以。
2.Knockout怎样通过AMD加载组件
当为视图模型和模版传入require声明时:
ko.components.register('my-component', {
viewModel: { require: 'some/module/name' },
template: { require: 'text!some-template.html' }
});
这些AMD模块被加载,实际上类似于使用了require(['some/module/name'], callback)和require(['text!some-template.html'], callback)。KO加载这些模块有三个需要注意的点:
*KO并不严格要求使用require.js,任何其它的AMD模块加载器都可以使用。
*KO并不影响加载模块的路径,路径仍然完全由所用的AMD加载器决定。
*KO并不关心所加载的模块是否是暴露了全局变量名称的模块。
2.1 AMD模块为按需加载
比如一个组件写在了一个绑定了if指令的标签中,那只有if对应的值真,组件模块才加载,否则不加载。如果组件模块已经加载过了, 那么将不再发送HTTP请求来请求模块,而是预加载之前存下来的模块。
3.1 推荐的AMD组件模块的定义方式
只要AMD模块返回的是以上任意一种合法的模块配置就可以作为一个有效的组件模块,但是有一种推荐的组件模块定义方法:
// - 使用这种模式定义模块的优点在于
// - 引入只需要一个require声明
// - 可以被require.js的r.js打包
define(['knockout', 'text!./my-component.html'], function(ko, htmlString) {
function MyComponentViewModel(params) {
// 在这里设置属性等
}
// 使用原型定义公共方法
MyComponentViewModel.prototype.doSomething = function() { ... };
// 返回组件的定义
return { viewModel: MyComponentViewModel, template: htmlString };
});
这样定义的组件模块,调用方法为:ko.components.register('my-component', { require: 'path/my-component' });。一个组件模块由两个文件组成,一个视图模型(path/my-component.js)和一个模版(path/my-component.html),创建自然,维护方便。
Knockout.js组件系统的详解之(一) - 组件的定义和注册的更多相关文章
- 【转载】BootStrap表格组件bootstrap table详解
(转载,来源“脚本之家”,作者不详) 一.Bootstrap Table的引入 关于Bootstrap Table的引入,一般来说还是两种方法: 1.直接下载源码,添加到项目里面来.由于Bootstr ...
- C++框架_之Qt的窗口部件系统的详解-上
C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...
- Vue组件通信方式全面详解
vue组件通信方式全面详解 众所周知,Vue主要思想就是组件化开发.因为,在实际的项目开发中,肯定会以组件的开发模式进行.形如页面和页面之间需要通信一样,Vue 组件和组件之间肯定也需要互通有无.共享 ...
- js调试工具Console命令详解
这篇文章主要介绍了js调试工具Console命令详解,需要的朋友可以参考下 一.显示信息的命令 复制代码 代码如下: < !DOCTYPE html> < html> &l ...
- mysql show variables系统变量详解
mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选 ...
- vc中调用Com组件的方法详解
vc中调用Com组件的方法详解 转载自:网络,来源未知,如有知晓者请告知我.需求:1.创建myCom.dll,该COM只有一个组件,两个接口: IGetRes--方法Hello(), IGet ...
- 重置出错?微软Win10平板Surface Pro 4重装系统教程详解
重置出错?微软Win10平板Surface Pro 4重装系统教程详解 2015-12-11 15:27:30来源:IT之家作者:凌空责编:凌空 评论:65 Surface Pro 4系统重置出错该怎 ...
- Windows XP硬盘安装Ubuntu 12.04双系统图文详解
Windows XP硬盘安装Ubuntu 12.04双系统图文详解 Ubuntu 12.04 LTS版本于2012年4月26日发布,趁着五一放假,赶紧在自己的Windows XP的电脑上安装下Ubun ...
- WeChatAPI 开源系统架构详解
WeChatAPI 开源系统架构详解 如果使用WeChatAPI,它扮演着什么样的角色? 从图中我们可以看到主要分为3个部分: 1.业务系统 2.WeChatAPI: WeChatWebAPI,主要是 ...
随机推荐
- Java String对象的问题 String s="a"+"b"+"c"+"d"
1, String s="a"+"b"+"c"+"d"创建了几个对象(假设之前串池是空的) 2,StringBuilde ...
- 【OpenStack】相关概念
网络 network和subnet Service subnets: 创建network,subnet, instances 官方示例 Network components: Switches/ Ro ...
- python configparser使用
.ini文件由若干section(部分)组成, 而每一个section又由若干键值对组成. 以 example.ini为例: [DEFAULT] ServerAliveInterval = 45 Co ...
- vue+窗格切换+田字+dicom显示_02
环境:vue+webpack+cornerstone ide:vs code 需求:窗格设置+拼图设置 分析: 由于时间的原因,我也没有Baidu更好的显示窗格的方法,所以使用比较笨的方法,通过组件显 ...
- Git分支merge和rebase的区别
Git merge是用来合并两个分支的. git merge b # 将b分支合并到当前分支 同样 git rebase b,也是把 b分支合并到当前分支 原理 如下: 假设你现在基于远程分支&quo ...
- js跨域传值,兼容ie8以上
js跨域传值,兼容ie8以上 事先说明,此方法并不支持ie8,如果想要支持ie8的话,需要用这种思路(来自微软): if (window.addEventListener) { window.addE ...
- 悲观锁,乐观锁,排他锁,行锁----MYSQL
在说具体的锁结构时,先思考一个问题,那就是为什么要上锁?然后我要如何选择锁?锁具体如何实现? 在文章得末尾我给出了我的个人答案. 一.什么是悲观锁? 1.悲观锁就是在操作数据时,认为此操作会出现数据冲 ...
- 项目(二)DNS解析——配置域名服务器
NDS服务器常见种类有:缓存域名服务器.主域名服务器.从域名服务器.DNS服务器查询方法有两种:递归查询和迭代查询.其中,递归查询是DNS服务器在本地通过缓存.本地映射.记录本得到结果,而迭代查询是D ...
- day36 GIL锁与线程池
多进程与多线程效率对比 # # """ # # 计算密集型 # """ # from threading import Thread # f ...
- openvpn显示连接成功但是无法进行git操作
使用openvpn连接公司内网以进行git操作.以管理员身份运行openvpn gui,一段时间后提示连接成功,右下角图标变成绿色,但是进行git操作,每次都发生失败,提示连接不上.右键点击openv ...