knockout 模型闭包 closespace,高内聚viewModel编写,event事件绑定

写knockout的人都知道,想声明一个绑定对象需要这么写。

function User(model) {
    this.Id = ko.observable(model ? model.Id : "---");
    this.Name = ko.observable(model ? model.Name : "---");
}

因面向对象的编程思想,都是把这些模拟的类,写在js文件中。然后页面一引用js文件就可以 new User() 了。

当有几个页面 有相互包含关系时,比如 div.Load(url,data,funtion(){});  load动态加载页面。

因为这个 被load的页是同事开发的,所以问题就来了,我一load这个页面,我的页面的功能就全部失效。因为我俩都声明了 User 造成了 代码污染。

好的那么问题就来了 有没有一个办法可以把他们隔离开来呢。闭包 对 很好的思路。那么knockout的一堆绑定对闭包的影响??好吧我也不确定。

但是首先要确定2件事。

第一我就需要先把这个 User给闭包掉,先减少污染。

function spaceUserInfo() {
    function User(model) {
        this.Id = ko.observable(model ? model.Id : "---");
        this.Name = ko.observable(model ? model.Name : "---");
    };
    this.User = User;
};

起一个 spaceUserInfo的名字。当然如果这个 spaceUserInfo也被重复了我就没办法了。

一、js模型闭包

第一个前提 我们都有通用的命名规范,以 space开头 加上 页面的名字。基本上同一个项目中 有相互引用关系的页面这么处理很难在相撞了。

至于 spaceUserInfo 为什么不用 (function(){})();  这种形式。因为他是匿名啊有木有。我不想把代码写得有多高大上,最起码通俗易懂还好用就行了。

二、页面js闭包

相信懂闭包的人一眼就看出来了。这个代码 是这种 (function(){})();  高大上的写法。当然我们这么写并不是为了高大上,因为我们需要立即执行的匿名函数有木有。

首先

传入 参数。里面需要 jquery 需要 knock 还需要我们之前声明的模拟类。

(function($,ko,space){})($, ko, new spaceUserInfo());

前2个参数不用说 new spaceUserInfo() 这个大家也能懂吧,这里就相当于 new了一个 class 进去。

匿名方法体中正常书写代码。

创建viewModel添加viewModel事件执行ko页面绑定。很正常的写法。

<script>
    (function ($, ko, space) {
        var _self = this;

        var viewModel = {
            User: ko.observable(new space.User()),
            Users: ko.observableArray(
                [
                    new space.User({ Id: ‘1‘, Name: ‘小明‘ }),
                    new space.User({ Id: ‘2‘, Name: ‘小强‘ }),
                    new space.User({ Id: ‘3‘, Name: ‘小花‘ })
                ]
            ),
            //————————————————————————————
            e: {}
        };
        viewModel.e.Add = function () {
            viewModel.Users.push(new space.User());
        };

        viewModel.e.show = function (user) {
            alert(user.Name());
        };

        //dom ready
        $(function () {
            ko.applyBindings(viewModel, $("#pageUserInfo")[0]);
        });
    })($, ko, new spaceUserInfo());
</script>

以上代码 是js部分。上面实现了闭包,下面才是重点,怎么写才能让我这个闭包无懈可击,不需要暴漏任何东西就能为页面工作呢?

下面看页面html代码。

<div id="pageUserInfo">
    <input type="button" name="name" value="模拟外部按钮" data-bind="click:function(){e.Add()}" />
    测试一个对象<br />
    <b>Id:</b><!--ko text:User().Id--><!--/ko--><br />
    <b>姓名:</b><!--ko text:User().Name--><!--/ko--><br />
    ————————————————————————————————<br />
    测试多个对象<br />
    <!--ko foreach:{data:Users,as:‘iuser‘}-->
    <b>Id:</b>  <!--ko text:iuser.Id--><!--/ko--><br />
    <b>姓名:</b>    <!--ko text:iuser.Name--><!--/ko-->
    <input type="text" name="name" data-bind="event:{change:function(){alert($element.value)}}" value=" " />
    <a href="javascript:;" data-bind="event:{ mouseover:function(){$parent.e.show(iuser)}}">test</a>
    <br />
    <!--/ko-->
</div>

很简短的几行代码。

运行结果如下

由于上面js底子打得好,所以在模型绑定上直接写 事件就行了。

值得注意的是 在foreach中绑定event 使用的 是   change 而非  onchange

<input type="text" name="name" data-bind="event:{change:function(){alert($element.value)}}" value=" " />

要function(){} 一下 要不然会被直接执行(不知道为什么)。

我们在viewmode上声明了所有方法,实现了 viewmode的高内聚。这样就不用在写一堆方法来做逻辑了,都写到内部,就解决了代码污染。

好的就到这里吧,我得干活了。

时间: 2024-09-21 05:47:21

knockout 模型闭包 closespace,高内聚viewModel编写,event事件绑定的相关文章

高内聚低耦合 浅析

内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事.它描述的是模块内的功能联系: 耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度.进入或访问一个模块的点以及通过接口的数据. 内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高. 所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则. 耦合:一个软件结构内不同模块之间互连程度的度量(耦合性也叫块间联系.指软件系统结

高内聚低耦合简单学习

起因:模块独立性指每个模块只完成系统要求的独立子功能,并且与其他模块的联系最少且接口简单, 两个定性的度量标准――耦合性和内聚性. 耦合性也称块间联系.指软件系统结构中各模块间相互联系紧密程度的一种度量.模块之间联系越 紧密,其耦合性就越强,模块的独立性则越差.模块间耦合高低取决于模块间接口的复杂性.调用的方 式及传递的信息.   耦合性分类(低――高): 无直接耦合;数据耦合;标记耦合;控制耦合;公共耦合;内容耦合; 1 无直接耦合: 2 数据耦合: 指两个模块之间有调用关系,传递的是简单的数

《如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件》

问题的提出我常常在思考一个问题,我们如何能设计出高水平.高质量的软件出来.怎样是高水平.高质量的软件?它应当是易于维护.易于适应变更.可重用性好的一个系统.如何做到这一点呢?答案当然是"低耦合.高内聚"了.低耦合就是软件在构造的时候,各个模块.各个功能.各个类都不会过度依赖于它周围的环境.只有这样,才能使我们的模块(功能.类)在周围发生变更时不受影响,做到易于维护和易于适应变更.正因为如此,也使它更易于重用到其它功能类似的环境中,提高了重用性.高内聚则使软件中的各个模块(功能.类)能够

对高内聚,低耦合的理解

内聚:一个模块内各个元素彼此结合的紧密程度 耦合:一个软件结构内不同模块之间互连程度的度量 最近编码的时候,总是在犹豫是把某个方法封装在一个类里,还是单独的封装成一个类.这让我突然想起内聚耦合这两个名词. 我们一直追求着,高内聚,低耦合. 对于低耦合,我粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在. 也就是说,让每个模块,尽可能的独立完成某个特定的子功能. 模块与模块之间的接口,尽量的少而简单. 如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分. 这样有利于

面向对象三大特性五大原则 + 低耦合高内聚

面向对象三大特性五大原则 + 低耦合高内聚 面向对象的三大特性是"封装."多态"."继承",五大原则是"单一职责原则"."开放封闭原则"."里氏替换原则"."依赖倒置原则"."接口分离原则". 什么是面向对象 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结

(三)闭包和高阶函数

虽然javascript是一门面向对象的编程语言,但这门语言同时也同时拥有许多函数式语言的特性. 函数式语言的鼻祖是LISP,javascript设计之初参考了LISP两大方言之一的Schenme,引入了Lambda表达式,闭包,高阶函数等特性.使用这些特性,我们就可以灵活的编写javascript代码. 一:闭包 对于javascript程序员来说,闭包(closure)是一个难懂又必须征服的概念.闭包的形成与变量作用域以及变量的声明周期密切相关. 1.变量作用域 变量的作用域就是指变量的有效

什么是高内聚、低耦合?

起因:模块独立性指每个模块只完成系统要求的独立子功能,并且与其他模块的联系最少且接口简单,两个定性的度量标准――耦合性和内聚性. 内聚:一个模块内各个元素彼此结合的紧密程度 耦合:一个软件结构内不同模块之间互连程度的度量 耦合性也称块间联系.指软件系统结构中各模块间相互联系紧密程度的一种度量.模块之间联系越紧密,其耦合性就越强,模块的独立性则越差.模块间耦合高低取决于模块间接口的复杂性.调用的方式及传递的信息. 耦合性分类(低――高): 无直接耦合;数据耦合;标记耦合;控制耦合;公共耦合;内容耦

低耦合,高内聚。实乃至理名言

项目的开发人员越来越多,对 git 的管理也越来越复杂. 然而,当前项目 git 仓库最大的问题在于,没有将前端和后端仓库分离.项目已经前后分离了,仓库却保持着高耦合的状态,偶尔会遇到 pull,merge 的时候,后端代码冲突,当时就懵逼了. 所以,『低耦合,高内聚』这句话,不进在代码编写中有效,在生活的方方面面都有着作用. 另外有句话叫:程序不是编写出来的,而是组装出来的.也是相同的道理. 每个小部分各司其职,最后由一个顶级管理者将这些小部分拼装组合成一个具有各种能力的强大结合体,这就是『低

小菜学设计模式——高内聚、低耦合

背景 本文标题为什么叫小菜学习设计模式,原因是本文内容主要是学习<大话设计模式>时的笔记摘要部分,当然,并不是记录书中小菜的学习过程,这个完全没有意义,而是指本人学习设计模式的成长之旅. 真诚的希望自己能够从一名小菜成长为一名大鸟! 编写的程序应该满足: 1)可维护 2)可扩展 3)可复用 4)够灵活 废话少说,言归正传,设计模式原则之:高内聚.低耦合 当然,这条原则不是面向接口编程的具体原则,他是所有原则.所有设计模式都必须遵循的一条亘古不变的宗旨. 网上学习与记录 起因:模块独立性指每个模