迷你MVVM框架 avalonjs 学习教程8、属性操作

属性操作是DOM操作很大的一块,它包括类名操作,表单元素的value属性操作,元素固有属性的管理,元素自定义属性的管理,某些元素的一些布尔属性的操作。大多数情况下,元素属性的值是字符串类型,我们称之为字符串属性,但有一些属性的是布尔,也存在是数字类型、节点引用的情况。当前jQuery处理它们就是搞了N个钩子对象,才摆平它们。avalon为了收拾它们也设置N多绑定,其中类名部分交由ms-classms-hoverms-active处理,这些其他章节介绍;表单元素的value属性之前也说过,可以用ms-valuems-duplex;剩下还有ms-checkedms-selectedms-readonlyms-disabledms-enabledms-valuems-titlems-altms-hrefms-srcms-attr-☆ 11个。其他前五个为布尔属性绑定,后五个为字符串属性绑定,最后一个为通用属性绑定。不过 后来, 随着如何判定固有属性的技术的发掘,它们最终全部由ms-attr-☆实现。

在IE下,需要对属性进行区分,如果是固有属性使用elem[name] = value赋值;是自定义属性,则直接使用elem.setAttribute(name, value);标准浏览器没有这么麻烦,全部使用elem.setAttribute(name, value),比如elem.setAttribute("value", "xxx")会自动同步到elee.value = "xxx"。

下面是其源码:

       

                if (boolMap[attrName]) {
                    var bool = boolMap[attrName]
                    if (typeof elem[bool] === "boolean") {
                        return elem[bool] = !!val //处理布尔属性
                    }
                }
                if (!W3C && propMap[attrName]) {//旧式IE下需要进行名字映射
                    attrName = propMap[attrName]
                    var isInnate = true
                }
                if (val === false) || (val === null) || (val === void 0) {
                    return elem.removeAttribute(attrName)
                }
                if (window.VBArray && !isInnate) {
                    //IE下需要区分固有属性与自定义属性
                    //固有属性及VML元素必须使用中括号方式赋值
                    //SVG元素必须用setAttribute赋值
                    if (isVML(elem)) {
                        isInnate = true
                    } else if(window.SVGElement && !(elem instanceof SVGElement)) {
                        var attrs = elem.attributes || {}
                        var attr = attrs[attrName]
                        isInnate = attr ? attr.expando === false : attr === null
                    }
                }
                if (isInnate) {
                    elem[attrName] = val
                } else {
                    elem.setAttribute(attrName, val)
                }

有关如何判定自定义属性或固有属性,及其详细推导过程,可以看我的书《javascript框架设计》的第十章。

<!DOCTYPE html>
<html>
    <head>
        <title>ms-attr-*</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width">
        <script src="avalon.js"></script>

        <script>
            avalon.define("ms-attr-*", function(vm) {
                vm.aaa = true
                vm.click = function() {
                    vm.aaa = !vm.aaa
                }
                vm.bbb = "@@@"
                vm.ccc = "&&&"
                vm.active = "active"
            })

        </script>
        <style>
            .active {
                background: goldenrod;
            }
            .readonly{
                border:1px solid blueviolet;
            }
        </style>

    </head>
    <body>
        <form method="get" action="aaa.html" ms-controller="ms-attr-*">
            <input ms-enabled="aaa" name="a1" value="12345"/>
            <input ms-disabled="aaa" name="a2" value="67890"/>
            <input ms-readonly="aaa" name="a3" ms-class="readonly: aaa" value="readonly" />

            <input ms-checked="aaa" type="checkbox" value="checkbox" name="a4"/>
            <select name="a5">
                <option>222</option>
                <option ms-selected="aaa">555</option>
            </select>
            <p>
                <input ms-attr-value="其他内容  {{ccc}}" name="a6" value="改"/>
                <input ms-attr-value="'其他内容 '+ccc" name="a7" value="改" />
                <input ms-value="其他内容  {{ccc}}" name="a8" value="改"/>
            </p>
            <button type="button" ms-click="click" ms-attr-class="active">
                点我
            </button>
            <input type="submit" value="提交" />
            <svg width="100" height="100">
            <circle ms-attr-cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
            </svg>
        </form>
    </body>
</html>

ms-enabled是ms-disabled的相反面,它根据表达式的值是否为真移除disabled属性。

avalon的ms-attr绑定无比强大,不用像jQuery那么需要用户判定是使用attr还是prop方法,使用自行处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MVVM(Model-View-ViewModel)是一种软件架构模式,它将应用程序分为三个主要部分:模型(Model)、视图(View)和视图模型(ViewModel)。MVVM框架的优点如下: 1. 分离关注点:MVVM框架通过将视图逻辑与业务逻辑分离,使代码更加清晰和可维护。视图负责展示数据和用户交互,而视图模型则负责处理业务逻辑和数据操作,模型则负责数据的存储和获取。这种分离使得代码更易于理解、测试和维护。 2. 可重用性:MVVM框架鼓励将逻辑和界面分离,使得视图模型可以独立于具体的视图进行开发和测试。这种设计使得视图模型可以在不同的界面中重用,提高了代码的可重用性。 3. 双向数据绑定:MVVM框架提供了双数据绑定机制,使得视图和视图模型之间的数据同步更加方便。当视图中的数据发生变化时,视图模型会自动更新相应的数据,并且当视图模型中的数据发生变化时,视图也会自动更新。这种机制减少了手动处理数据同步的代码量,提高了开发效率。 4. 测试友好:MVVM框架的分层结构使得各个组件可以独立进行单元测试。视图模型中的业务逻辑可以通过单元测试来验证其正确性,而视图则可以通过自动化测试来验证其交互行为。这种测试友好的设计有助于提高代码的质量和稳定性。 为什么选择MVVM框架,主要有以下几个原因: 1. 提高开发效率:MVVM框架通过数据绑定和分离关注点的设计,减少了开发者编写重复代码的工作量,提高了开发效率。 2. 提高代码质量:MVVM框架的分层结构和测试友好的设计使得代码更易于理解、测试和维护,提高了代码的质量。 3. 支持团队协作:MVVM框架提供了清晰的代码结构和规范,使得团队成员可以更好地协同开发和维护项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值