Ruby's Louvre

每天学习一点点算法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

我的MVVM框架 v3教程——流程绑定

avalon为我们带来了三大利点:

  • 关注点分离
  • 操作数据即操作DOM
  • 动态模板

关注点分离是MVVM与身俱来的。

操作数据即操作DOM,是VM中的访问器带来的。

动态模板是流程绑定实现的。

avalon目前拥有四种流程绑定器:each, with, if, unless。

先给出JS部分代码:

require("avalon,ready", function($) {
                var $$ = $.MVVM    
                var VM = $$.render({
                    user:{
                        xxxx: "aaaa",
                        yyyy: "bbbb"
                    },
                    list:[{
                            title:"aaa"
                        },
                        {
                            title:"bbb"
                        },
                        {
                            title:"ccc"
                        },
                        {
                            title:"ddd"
                        }
                    ],
                    toggle: true
                });
                setTimeout(function(){
                    VM.toggle(false)
                },2500)
});

each是用于遍历数组与集合,对应到HTML的绑定形式为:data-each-[item]-[index]

<ul data-each-item="list">
           <li data-text="item.title">aaaa</li>
</ul>

with能让用户直接在下级元素中直接使用这个对象的第一层的键名作为参数,就像js的with一样,ko2.1之前就是直接这么干的。不过avalon是通过特权函数与原型函数模拟这效果的。

if( code == 2 ){      //处理with 绑定
                           var fn = function(){}//随便搞个构造器
                           fn.prototype = model;//让它继承原来的VM,或VM某一层的对象属性
                           model = new fn;      //然后得到它的实例
                           for(var name in val){//然后遍历with的参数对象的键值对,将它们赋给实例。
                               if(val.hasOwnProperty(name)){//因此访问时会先访问val的第一层值,没有到原型链上找
                                   model[name] = val[name]
                               }
                           }
                       }
<div data-with="user">
    <p data-text="xxxx"></p>
    <p data-text="yyyy"></p>
</div>

if绑定,如果它的参数是真值,那么它就渲染它的子节点,否则里面为空。

if绑定,如果它的参数是假值,那么它就渲染它的子节点,否则里面为空。

<div data-if="toggle">
    这是诸葛亮
</div>
<div data-unless="toggle">
    这是周瑜
</div>
示例
  • aaa
  • bbb
  • ccc
  • ddd

aaaa

bbbb

这是诸葛亮

如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码

posted on   司徒正美  阅读(1689)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示