利用Knockout来实现可重复利用的组件Component

在一个大型项目或者在一个公司的不同的web项目,一个可重复利用的同时能提供丰富互动的web组件的重要性不言而喻。一个良好设计的Web组件,不但能够减少开发时间,同时可以保持最大的扩展性和维护性。这样开发人员能够尽可能的集中在商业逻辑设计以及基础的组件开发上。这样对公司来说,是一种技术的积累,对开发人员来说在开发组件的时候能够保持极大的热情和动力同时减少复制粘贴的次数。

Knockout提供了2种调用组件的方法。

一种是Web-Component模式。比如一个针对表单的筛选功能的组件。

<filters-component params="gridContainer:$component, vm: $root"></filters-component>

另一种是动态的或者利用虚拟元素的模式。比如针对每个数据类型,我们有不同筛选的图形界面和功能。

<!-- ko component: {name: uiComponentType,params: {filterObserver:$data, filterContainer:$component}} -->
<!-- /ko -->

第一种模式想必很熟悉,这就好比在Html增加了新的Tag. 第二种模式,实现了在客户端依然能够动态调用或者生成不同组件以及功能的可能性。动态的灵活性大大增加了系统的功能和抽象性。

现在我们就用require.js以及knockout来定一个组件。比如我们的需求是一个类似Excel的表单的筛选功能,但是对不同数据类型,我们需要有不同的逻辑符号。就像对数值类型,我们有大于,小于,等于。对字符类型,我们需要包含,起始于,结束于等等。对日期类型,有当前年份,当前月份以及开始和结束日期的自定义。那整个的实现想法就是,首先我们有一个组件叫筛选容器, 它主要提供了基础的功能,比如监控每个过滤组件的用户的输入和选择,针对所有过滤组件的基础功能,比如重置,清除,管理当前的过滤组件。另外,针对每个数值类型,我们有不同的过滤组件。那整个大体的结构布局就像下图:

每个组件都位于一个独自的文件夹里,中间包括了ViewModel以及View。在filterContainerView.html里面我们就可以动态调用不同过滤组件的组件。

x

<div class="col-xs-10 col-sm-10 col-md-10">
  <ul class="list-inline">
    <li>
      <!-- ko component: {name: uiComponentType,params: {filterObserver:$data, filterContainer:$component}} -->
      <!-- /ko -->
    </li>
  </ul>
</div>

  

一个良好的结构,一个良好的组件参数或者接口的设计决定了组件的质量和它的可重复利用性。

时间: 2024-08-08 12:02:32

利用Knockout来实现可重复利用的组件Component的相关文章

Unity3d基础组件 (Component) 和脚本 (Script) 关系

原版的:http://edu.china.unity3d.com/learning_document/getData?file=/Manual/TheComponent-ScriptRelationship.html 组件 (Component) 和脚本 (Script) 的关系 创建脚本并将其连接到游戏对象 (GameObject) 时,脚本会出如今游戏对象 (GameObject) 的检视器 (Inspector) 中,就像一个组件 (Component). 这是由于脚本在保存时变成了组件

ExtJS关于组件Component生命周期

extjs组件生命周期大体分为3个阶段:初始化.渲染.销毁. 第一阶段:初始化 初始化工作开始于组件的诞生,所有必须的配置设定.事件注册.预渲染处理等都在此时进行. 1.应用组件的配置: 当初始化一个组件的实例时,传递的组件配置对象包含了希望让组件拥有的所有功能,这些都是在Ext.Component基类的前几行代码完成的. 2.注册事件: 诸如enable/disable,show,hide,render,destory,state restore,state save等等事件,是所有继承于Ex

angular组件component无法传递数据的坑

问题:使用组件component时组件无法从外获取到绑定的数据 先贴上官方component的介绍及demo地址:https://docs.angularjs.org/guide/component; 将confirm-dialog.html插入到main.html页面,并将vm.agreemnt传入到confirm.dialog.html中 main.html 在此页面中使用cost-info来传输数据,将main.controller中的vm.agreement传递给cost-info ,o

利用easyUI的combobox打造自动提示组件

自动提示是时下一个很流行的功能,比如说百度.谷歌的搜索输入框都使用到了这么一个功能. 由于easyUI的combobox设计师已经考虑到了这个功能,所以只需简单几步我们可以轻松打造自己的自动提示组件. 自动提示有两种模式,一种是本地(local)一种是远程的(remote). local的意思也就是说先将所有的数据都加载到客户端页面,之后仅仅是在这些已加载的数据中去过滤,不会向服务器发出额外的请求 而remote呢,也就是说事先并不加载所有数据,而是等到用户输入关键字之后,再向服务器发出请求,返

利用简洁的图片预加载组件提升h5移动页面的用户体验

在做h5移动页面,相信大家一定碰到过页面已经打开,但是里面的图片还未加载出来的情况,这种问题虽然不影响页面的功能,但是不利于用户体验.抛开网速的原因,解决这个问题有多方面的思路:最基本的,要从http请求合并,缓存管理,图片压缩等方面做性能优化:另外就是可以对页面里用到的所有图片做预加载的处理,当用户打开页面的时候不立即显示第一屏,而是先显示资源加载效果,等到加载完毕,再来显示页面的主内容,这样就能解决那个问题.虽然这种加载效果占用了用户的浏览时间,但是我们可以把它做的好看有趣一点,所以也不会影

利用getBoundingClientRect方法实现简洁的sticky组件

sticky组件,通常应用于导航条或者工具栏,当网页在某一区域滚动的时候,将导航条或工具栏这类元素固定在页面顶部或底部,方便用户快速进行这类元素提供的操作.本文介绍这种组件的实现思路,并提供一个同时支持将sticky元素固定在顶部或底部的具体实现,由于这种组件在网站中非常常见,所以有必要掌握它的实现方式,以便在有需要的时候基于它的思路写出功能更多的组件出来. 代码下载 固定在顶部的demo效果(对应sticky-top.html): 固定在底部的demo效果(对应sticky-bottom.ht

Android 利用addView 动态给Activity添加View组件

本文主要讲述如何动态给UI界面添加布局和控件,在编程的时候很多时候需要动态显示一些内容,在动态添加View的时候,主要使用addView方法. 1. addView方法简介 在Android 中,可以利用排版View的 addView 函数,将动态产生的View 物件加入到排版View 中. 例子如下: 界面代码: <LinearLayout android:id="@+id/viewObj" android:layout_width="wrap_content&quo

Yii2.0 高级模版编写使用自定义组件(component)

翻译自:http://www.yiiframework.com/wiki/760/yii-2-0-write-use-a-custom-component-in-yii2-0-advanced-template/ 简单模版中添加自定义组件:http://www.yiiframework.com/wiki/747/write-use-a-custom-component-in-yii2-0/ 我们实现的是添加一个读取真实IP的组件,下面是详细步骤: 1. 在项目根目录的common目录中新建com

Vue.js 组件 component

什么是组件? 组件(component)是Vue.js最强大的功能之一,核心目标是扩展HTML元素,封装可重用的代码.我们可以把组件代码按照template.style.script的拆分方式,放置到对应的 .vue  文件中. Vue.js的组件可以理解为预先定义好行为的ViewModel类,一个组件可以预定义很多选项,但最核心的是以下几个: 模板(template) --  模板声明了数据和最终展现给用户的DOM之间的映射关系 初始数据(data) --  一个组件的初始数据状态.对于可复用