Avalon 学习系列 (一) —— 初步入门

news2024/12/23 13:26:39

相关链接

Avalon github地址
Avalon 快速入门
基于 Avalon的组件库-OniUI
Avalon 入门教程
Avalon CDN

简介

Avalon 是司徒正美开发和维护的一款基于虚拟 DOM 与属性劫持的迷你、 易用、 高性能 的 前端 MVVM 框架,最早发布于2012.09.15。 其拥有超优秀的兼容性,支持移动开发、后端渲染、WEB Component 式组件开发,无需编译,开箱即用,可以轻松实现数据的隔离和双向绑定。

优点

  1. 使用简单,在 HTML 中添加绑定,在 JS 中用avalon.define 定义 ViewModel,再调用 avalon.scan 方法,就可以了;
  2. 体积小巧,没有任何依赖,压缩后仅有60多kb;
  3. 兼容 IE6+
  4. 效率更高,跑起来比angularknockout都要更快,在移动端上该优势会更大(avalon有移动端专版的avalon.modern.js);
  5. 有配套的 UI 库;
  6. 支持管道符风格的过滤函数,方便格式化输出;
  7. 局部刷新的颗粒度已细化到一个文本节点,特性节点;
  8. 它将要操作的节点,在第一次扫描就与视图刷新函数相绑定,并缓存起来,避免了选择器的出场的,大量减少了 DOM 操作;
  9. 使用类似 CSS 的重叠覆盖机制,让各个 ViewModel 分区交替地渲染页面;
  10. DOM 节点移除时,智能卸载对应的视图刷新函数,节约内存;
  11. 操作数据即操作 DOM,对ViewModel的操作都会同步到ViewModel
  12. 实现了数据和视图的隔离,可维护性好。

MVVM模式

Avalon 将所有前端代码彻底分成两部分,视图的处理通过绑定实现, 业务逻辑则集中在一个个叫 vm 的对象中处理;操作 vm 的数据,就自然而然地同步到视图。Object.defineProperty 的作用是将对象的某一个属性,转换一个settergetter, 只要劫持这两个方法,通过 Pub/Sub 模式就能偷偷操作视图。

Avalon 也是基于这个理论建立起来的,在视图上添加一些标记,然后在Java中对对象的属性进行监听,当这些属性发生变化,以观察者模式,通知视图进行变更;视图上也可以绑定一些事件,然后当这些事件被触发时,反过来修改这个对象的特定属性,这叫双向绑定。

所有需要操作的数据被集中一起管理,它们合并成一个叫ViewModel 的东西,而原来的HTML页面只做了一些修改,称之为View,而View本身是一个动态模板(Live Template)

使用

<!DOCTYPE html>
<html>

<head lang="en">
  <meta charset="UTF-8">
  <title>Avalon demo</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script type="text/javascript" src="./avalon.js"></script>
  <script type="text/javascript">
    var vm = avalon.define({  // wrap 用作该 Model的载体
      $id: "maincontainer",   // 告诉avalon这个Model是作用于哪个ms-controller的
      msg: "Hello,world!",   // 定义一个avalon对象属性“msg”,其值是“Hello,world!”
      desc: "This is description!"
    });
    avalon.scan(); // 这句话可以加,也可以不加,因为avalon有自己的DOMReady模块,会自动扫描全文。
  </script>
  <style>
    .ms-controller {
      display: none;
    }
  </style>
</head>

<body>
  <div>
    <!-- 给div加上监听器 -->
    <div ms-controller="maincontainer">
      <p>{{msg}}</p>
      <p>{{@desc}}</p>
    </div>
  </div>
</body>

</html>

以上代码的执行流程如下:

1)将 avalon.js 引入页面中;

2)设置控制域,为视图 html 指定一个控制域,并绑定一个容器(avalon 称之为 vm);

3)使用 avalon.define({}) 定义一个 vm 实例,$id 对应控制域名,告诉 avalon 这个实例属于哪个控制域;

4)将 vm 中的数据(实例中的 msg、desc 等)绑定到视图中,可以使用 {{@*}} 或者指令(不过,低版本的 avalon 使用{{}} 可能会导致某种 bug。)

相关概念

控制域

<div ms-controller="maincontainer">

如上所示,Avalon 的控制域属性名为 “ms-controller”,把它绑定到一个容器后,Avalon 就能扫描和监听这个容器内的所有(绑定了 Avalon 方法或带有插值表达式的)元素了。

定义 Model

Model 的定义是通过 javascript 来实现的,通过 avalon.define() 函数来定义,如下:

<script>
var model = avalon.define('maincontainer', function(vm){
    vm.msg= 'Hello,world!';
});
</script>

或者:

  <script type="text/javascript">
    var vm = avalon.define({  // wrap 用作该 Model的载体
      $id: "maincontainer",   // 告诉avalon这个Model是作用于哪个ms-controller的
      msg: "Hello,world!",   // 定义一个avalon对象属性“msg”,其值是“Hello,world!”
      desc: "This is description!"
    });
    avalon.scan(); // 这句话可以加,也可以不加,因为avalon有自己的DOMReady模块,会自动扫描全文。
  </script>

Avalon 的所有操作都是围绕 vm 进行。 vm,亦即view model,视图模型。将一个 JS 对象添加一个 $id 属性, 再放到 avalon.define 方法里面,就能得到一个 vm

vm 是一种利用 ProxyObject.definePropertiesVBScript 创建的特殊对象。

  1. avalon 中,使用 avalon.define({ ... }) 的形式来定义一个Model 实例(其参数可以看做一个 avalon 数据对象);
  2. $id 是内置属性,对应所要扫描和监控的控制域名,这个 id 会找到html 页面的对应的 controller
  3. Model 实例内部定义了一个属性 msg,在对应的控制域里,使用 avalon 插值表达式 {{msg}},可以自动绑定其值:Hello,world!

以上实例页面效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/631015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python中的模块包第三方库详解

模块&包 模块 一个.py文件就是一个模块&#xff0c;里面是一些函数和变量&#xff0c;需要的时候可以导入。 模块命名规范: 1.以英文开头&#xff0c;不出现中文 2.模块名不应与系统内置函数重名 包 包本身就是一个文件夹&#xff0c;如果文件夹内有__init__.py文件&…

浅谈iic时序

一、iic通信核心要点 在iic通信中&#xff0c;进行数据传输的时候&#xff0c;遵循在scl时钟线高的时候保持sda电平稳定&#xff0c;这个电平值就是要写入的值&#xff0c;然后&#xff0c;在scl时钟线拉低的时候去改变sda上的值&#xff0c;达到自己想要输出的值 所以说&…

如何做架构设计

1、设计很重要 我们可以看一下周边的事物&#xff0c;那些好的东西&#xff0c;他们并不会天然存在&#xff0c;都是被设计出来的&#xff0c;因此设计就是创造和改善事物的重要过程。设计的重要之处在于&#xff0c;最初的设计往往决定最终的结果&#xff0c;甚至决定着事物的…

端口扫描伪装技术实践

端口扫描伪装技术实践 1.-f&#xff08;分段传输&#xff09;2.-mtu&#xff08;使用指定的MTU&#xff09;3.-D&#xff08;使用诱饵主机隐蔽扫描&#xff09;4.--source-port&#xff08;源端口欺骗&#xff09;5.--data-length &#xff08;发送报文时附加随机数据&#xff…

入职字节外包一个月,我离职了····

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

电子元器件解析02之电容(二)——电容分类与应用场景

书接上文&#xff1a;电子元器件解析02之电容(一)——定义与性能参数&#xff1a;https://blog.csdn.net/weixin_42837669/article/details/131142286 摘要 本文总结了各种不同介质电容的特性&#xff0c;包括陶瓷电容、电解电容、薄膜电容等&#xff1b;同时对一些特殊场合的电…

Hadoop Distributed System (HDFS) 写入和读取流程

一、HDFS HDFS全称是Hadoop Distributed System。HDFS是为以流的方式存取大文件而设计的。适用于几百MB&#xff0c;GB以及TB&#xff0c;并写一次读多次的场合。而对于低延时数据访问、大量小文件、同时写和任意的文件修改&#xff0c;则并不是十分适合。 目前HDFS支持的使用…

HTTP协议【网络基础/应用层】

文章目录 1. 网络基础 TCP/IP2. 与HTTP密切相关的协议2.1 负责传输的 IP 协议路由选择 2.2 确保可靠性的 TCP 协议三次握手 2.3 负责域名解析的 DNS 服务2.4 各种协议和 HTTP 协议的关系 3. URL和编码问题3.1 介绍格式 3.2 编码问题 4. 初识 HTTP 协议4.1 C-S 模式4.2 通过响应…

vue中开发包、生产包、全局包的区别以及安装语法

目录 开发包 (devDependencies) 安装方法 生产包 (dependencies) 安装方法 全局包 (Global build) 安装方法 vue中有三种不同类型的包&#xff1a;开发包 (Development build)&#xff0c;生产包 (Production build) 和全局包 (Global build)。下面我们分别解释它们的区别…

EVE-NG 平台搭建以及发布“Ruijieroute”“Ruijieswitch”

下载相关资源 1、锐捷模拟器镜像文件&#xff1a;锐捷镜像官方下载链接 2、VMware虚拟化平台&#xff1a;可以是VMware vSphere、也可以是VMware Workstation&#xff1a;VMware Workstation Pro官方下载链接 当然&#xff0c;我们也可以使用其他虚拟化平台&#xff1a;Orac…

什么,你还在用 momentJs 处理相对时间

我想&#xff0c;下面这段代码&#xff0c;你是不是在开发中常常这样使用来计算距离现在过去了多长时间&#xff1a; import moment from moment // 61k (gzipped:19.k) function Relative(props) {const timeString moment(props.date).fromNow()return <>{timeString…

Tomcat实现ThreadPoolExecutor和JDK线程池区别

1.1 tomcat线程池和juc线程池流程 jdk 线程池策略&#xff1a; 当线程池中线程数量小于 corePoolSize&#xff0c;每来一个任务&#xff0c;就会创建一个线程执行这个任务当前线程池线程数量大于等于 corePoolSize&#xff0c;则每来一个任务&#xff0c;会尝试将其添加到任务…

深入理解深度学习——注意力机制(Attention Mechanism):位置编码(Positional Encoding)

分类目录&#xff1a;《深入理解深度学习》总目录 相关文章&#xff1a; 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;基础知识 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;注意力汇聚与Nadaraya-Watson核回归 注意力机制&#…

【CSS---定位基础篇】

CSS---定位基础篇 CSS-----基础定位:一 、 学习定位原因&#xff1a;&#xff08;定位的作用&#xff09;二 、定位组成&#xff1a;2.1 四种定位模式&#xff1a;&#xff08;1&#xff09;静态定位&#xff08;了解&#xff09;&#xff1a;&#xff08;2&#xff09;相对定位…

8.1 正弦波振荡电路(1)

正弦波振荡电路是在没有外加输入信号的情况下&#xff0c;依靠电路自激振荡而产生正弦波输出电压的电路。它广泛地应用于测量、遥控、通讯、自动控制、热处理和超声波电焊等加工设备之中&#xff0c;也作为模拟电子电路的测试信号。 一、概述、 1、产生正弦波振荡的条件 在负…

“不擅长开发,所以选择测试”,软件测试面试时这么说就凉了...

见过不少软件测试岗位&#xff0c;在面试时&#xff0c;问到选择软件测试作为职业的原因时 有不少测试工程师会回答&#xff1a;因为不擅长或不喜欢开发的工作。 这个想法&#xff0c;这个回答&#xff0c;就已经在面试官眼里打低分了。 现在网上也有不少类似观点 “不喜欢开…

TiDB亿级数据亚秒响应查询将MySql数据同步到TiDB

目录 1 MySQL环境准备1.1 MySQL测试数据库1.1.1 导入数据1.1.2 验证是否成功 2 DM数据迁移2.1 TiUP DM 组件简介2.1.1 基本功能2.1.2 使用限制 2.2 TiUP安装 DM组件2.2.1 安装TiUP DM 组件2.2.2 更新 TiUP DM 组件 2.3 TiUP部署 DM组件2.3.1 编辑初始化配置2.3.2 部署命令格式2…

PID算法:增量式PID 位置式PID

前面的文章已经介绍过什么是pid了&#xff0c;现在再回顾一下&#xff1a; PID&#xff1a;是过程控制中常用的一种针对某个对象或者参数进行自动控制的一种算法。 这一篇分享不打算再深究pid的理论知识&#xff0c;如果有不懂或者对pid感兴趣的朋友&#xff0c;可以自行查阅资…

【docker桌面版】windows使用docker搭建nginx

1.拉取nginx镜像 docker pull nginx 2.运行容器 docker run -d -p 80:8081 --name nginx nginx 3.本地磁盘创建nginx目录 D:\Docker\project\nginx 4.复制docker中的nginx配置文件 查看运行的容器docker ps -a docker cp 8f18d58bc77b:/etc/nginx/nginx.conf D:\Docker…

【Leetcode】DP | 打家劫舍,当一个机灵的小偷

198 打家劫舍 令 D [ i ] D[i] D[i]表示前 i i i间房子的最大收益&#xff1a; D [ i ] max ⁡ ( D [ i − 1 ] , D [ i − 2 ] n u m s [ i ] ) D [ 0 ] n u m s [ 0 ] D [ 1 ] max ⁡ ( n u m s [ 0 ] , n u m s [ 1 ] ) D[i] \max(D[i -1], D[i-2]nums[i]) \\ D[0] …