基础用法:通过指令修改 HTML
Avalon2 提供多种指令(以 ms-
开头)实现 HTML 的动态修改,常见指令及示例如下:
指令 | 作用 | 示例代码 |
---|---|---|
ms-text |
绑定文本内容,替换元素内的 HTML 内容 | <div ms-text="message"></div> ,配合 message: 'Hello Avalon' 使用 |
ms-html |
插入 HTML 片段(需谨慎使用,防止 XSS) | <div ms-html="rawHtml"></div> ,配合 rawHtml: '<b>加粗文本</b>' 使用 |
ms-attr |
动态修改元素属性(如 src 、href 、style ) |
<img ms-attr="{src:imageUrl}"/> ,配合 imageUrl: 'https://example.com/img.png' |
ms-css |
动态修改元素样式 | <div ms-css="{color:textColor}">文字</div> ,配合 textColor: 'red' 使用 |
ms-if |
条件渲染(类似 v-if ) |
<div ms-if="isVisible">可见内容</div> ,配合 isVisible: true 使用 |
示例场景:修改文本和属性
<div id="app" ms-controller="appCtrl"> <p ms-text="welcomeText"></p> <button ms-attr="{disabled: isDisabled}">点击</button> </div> <script> var app = avalon.define({ $id: 'appCtrl', welcomeText: '欢迎使用Avalon2!', isDisabled: false }); </script>
效果:段落显示文本,按钮根据 isDisabled
状态禁用或启用。
高级场景:动态生成复杂 HTML
对于复杂结构(如列表、动态表单),可通过以下方式实现:
数组渲染与 ms-repeat
<ul ms-controller="listCtrl"> <li ms-repeat="item in items"> {{item.name}} {{item.value}} </li> </ul> <script> var listCtrl = avalon.define({ $id: 'listCtrl', items: [ { name: 'Item 1', value: 100 }, { name: 'Item 2', value: 200 } ] }); </script>
说明:ms-repeat
会自动遍历 items
数组并生成列表项。
动态插入 HTML 片段
若需直接插入预定义模板,可使用 ms-html
或自定义组件:
<div ms-html="templateContent"></div> <script> var app = avalon.define({ templateContent: '<h3>动态标题</h3><p>这是嵌入的HTML</p>' }); </script>
处理不完整 HTML 标签(后端数据问题)
当后端返回的 HTML 片段存在不闭合标签时,可通过以下取巧方法修复:
- 将数据赋值给隐藏的
div
,利用浏览器自动补全特性。 - 提取补全后的 HTML 并重新渲染。
<div id="hiddenDiv" style="display:none;" ms-html="rawData"></div> <div ms-html="fixedHtml"></div>
“`
注意:此方法仅推荐在后端无法修正时使用,可能存在性能开销。
数据驱动视图更新
Avalon2 的核心是数据双向绑定,修改 HTML 的本质是通过更新 ViewModel
数据触发视图变更。
// 初始化视图模型 var vm = avalon.define({ $id: 'demo', '初始标题', updateTitle: function() { this.title = '更新后的标题'; // 修改数据后,HTML 自动同步 } }); // HTML 绑定数据 <div ms-controller="demo"> <h1 ms-text="title"></h1> <button onclick="updateTitle()">修改标题</button> </div>
关键点:
- 通过
ms-controller
定义作用域。 - 直接修改
vm
中的数据,避免直接操作 DOM。
自定义过滤器与指令
若需对 HTML 进行格式化或特殊处理,可定义过滤器:
<div ms-text="message | filter"></div> <script> avalon.filter('filter', function(value) { return value.toUpperCase(); // 示例:转大写 }); </script>
说明:过滤器可用于文本截取、日期格式化等场景。
FAQs
问题1:为什么修改了数据但 HTML 没更新?
- 解答:
- 检查是否在
ViewModel
中正确定义数据(如$id
是否正确)。 - 确保使用了支持双向绑定的指令(如
ms-text
而非普通innerHTML
)。 - 若数据是对象或数组,确保引用正确(如
item in items
需匹配数组结构)。
- 检查是否在
问题2:如何在Avalon2中动态添加新的HTML元素?
- 解答:
- 直接操作DOM:通过
document.createElement
创建元素并追加到容器中。 - 推荐方式:修改
ViewModel
的数组或对象数据,搭配ms-repeat
自动渲染。vm.items.push({ name: 'New Item', value: 300 }); // 自动触发列表更新
- 直接操作DOM:通过
Avalon2 修改 HTML 的核心原则是数据驱动,通过指令绑定、模型更新或组件化实现动态渲染,基础场景建议优先使用内置指令(如 ms-text
、ms-html
),复杂需求可结合自定义过滤器或直接操作 DOM,但需注意保持
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/69208.html