MVVM架构~使用boxy和knockoutjs实现编辑功能

简介:

这个功能我认为非常有用,尤其在后台管理系统中,它对用户来说,使用体验这块非常不错,下面是它的截图

说在前

在实现这个功能中,我们对knockout的基础知识一定要牢牢掌握,要知道,在knockout里一切都是对象,并且要知识knockout可以根据DIV进行绑定,对于验证这块,可以根据你的object进行验证,而并非只能验证全局对象,而对于boxy来说,

要知道它加载HTML代码的方式(如果HTML代码上有knockout绑定,则需要先将html代码加载上,然后再绑定model,这就用到了boxy的回调属性afterShow)

做在后

Html代码

<table class="listTbl">
    <thead>
        <tr>
            <td width="100"></td>
            <td>ID</td>
            <td>姓名</td>
            <td>电子邮件</td>
        </tr>
    </thead>
    <tbody data-bind="foreach:UserList">
        <tr>
            <td>
                <a href="javascript:;" data-bind="click:$parent.del">删除</a>
                <a href="javascript:;" data-bind="click:$parent.edit">编辑</a>
            </td>
            <td data-bind="text:UserInfoID"></td>
            <td data-bind="text:UserName"></td>
            <td data-bind="text:Email"></td>
        </tr>
    </tbody>
</table>
<script type="text/html" id="editUserDiv">
    <form style="width: 500px;" id="editUser" data-bind="with:selectUser">
        <div class="editor-label">
            账号:
        </div>
        <div class="editor-field">
            <input type="hidden" name="UserInfoID" data-bind='value: UserInfoID' />
            <input name="UserName" data-bind='value: UserName' />
        </div>
        <div class="editor-label">
            Email:
        </div>
        <div class="editor-field">
            <input name="Email" data-bind='value: Email' />
        </div>
        <div class="editor-label">
            手机:
        </div>
        <div class="editor-field">
            <input name="Phone" data-bind='value: Phone' />
        </div>
        <div class="editor-label">
            密码:
        </div>
        <div class="editor-field">
            <input name="Password" data-bind='value: Password' />
        </div>
        <div class="editor-label">
            真实姓名:
        </div>
        <div class="editor-field">
            <input name="RealName" data-bind='value: RealName' />
        </div>

        <div style="clear: both;"></div>

        <p>
            <input type="button" value="Save" data-bind="click:$parent.save" />
        </p>
    </form>
</script>

JS代码

<script type="text/ecmascript">
    function toVal(obj) {
        if (typeof obj == "function")
            return obj();
        else
            return obj;
    }
    var Model = function () {

        //properies
        var self = this;
        ko.validation.configure({//ko.validation相关配置
            insertMessages: true//不自动插入错误消息
        });

        self.UserList = ko.observableArray(@Html.Raw(Json.Encode(Model)));
        self.selectUser = ko.observable();
        //methods
        self.del = function (o) {

            Boxy.confirm("are you sure?", function () {
                $.post("/ef/DelAjaxPost?userinfoID=" + o.UserInfoID, function (data) {
                    alert(data == true ? "成功" : "失败");
                    self.UserList.remove(o);
                });
            });
        }

        self.edit = function (o) {
            $(".boxy-wrapper").empty()//关闭之前的弹框
            new Boxy($("#editUserDiv").html(), {
                afterShow: function () {//弹出框这前,绑定数据到弹框元素上  
                    //属性验证
                    o.Phone = ko.observable(toVal(o.Phone)).extend({ required: true });/*先将要验证的字段变成ko对象,并添加扩展验证特性*/
                    o.Email = ko.observable(toVal(o.Email)).extend({ required: true });
                    o.RealName = ko.observable(toVal(o.RealName)).extend({ required: true });
                    o.Password = ko.observable(toVal(o.Password)).extend({ required: true });
                    o.UserName = ko.observable(toVal(o.UserName)).extend({ required: true });
                    //绑定对象到ko
                    self.selectUser(o);

                    //绑定对象到页面
                    ko.applyBindings(self, document.getElementById("editUser"));
                }, modal: true, title: "提示", closeText: "x"
            });
        }



        self.save = function (o) {
            self.errors = ko.validation.group(o);
            if (o.isValid()) {

                $.post("/EF/EditAjaxPost", $("form").serialize()/*这个方法必须使input有name属性,只有id属性不行*/, function (data) {
                    location.href = "/ef/userlist";
                });
            } else {
                self.errors.showAllMessages();
            }

        }

    }
    var M = new Model();
    ko.applyBindings(M);
</script>

我们看在上面的代码,很简单,其实我也是找不少资料,因为开始做的时间出现了很多意想不到的问题,不过,庆幸的是,我还是把它解决了,呵呵.

欢迎大家和我一起去学习KnockoutJS,一起去讨论关于MVVM架构的一些想法!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:MVVM架构~使用boxy和knockoutjs实现编辑功能,如需转载请自行联系原博主。

目录
相关文章
|
11天前
|
设计模式 前端开发 数据库
构建高效Android应用:使用Jetpack架构组件实现MVVM模式
【4月更文挑战第21天】 在移动开发领域,构建一个既健壮又易于维护的Android应用是每个开发者的目标。随着项目复杂度的增加,传统的MVP或MVC架构往往难以应对快速变化的市场需求和复杂的业务逻辑。本文将探讨如何利用Android Jetpack中的架构组件来实施MVVM(Model-View-ViewModel)设计模式,旨在提供一个更加模块化、可测试且易于管理的代码结构。通过具体案例分析,我们将展示如何使用LiveData, ViewModel, 和Repository来实现界面与业务逻辑的分离,以及如何利用Room数据库进行持久化存储。最终,你将获得一个响应迅速、可扩展且符合现代软件工
15 0
|
1月前
|
移动开发 前端开发 数据管理
构建高效Android应用:采用MVVM架构与LiveData的全面指南
在移动开发领域,构建一个既快速又可靠的应用对于开发者来说至关重要。随着Android Jetpack组件的推出,MVVM(Model-View-ViewModel)架构和LiveData已成为实现响应式、可测试且易于维护应用的首选解决方案。本文将深入探讨如何在Android应用中实施MVVM模式,以及如何利用LiveData来优化UI组件的数据更新流程,确保用户界面与业务逻辑之间的高度解耦和流畅交互。
18 4
|
2月前
|
NoSQL Java Redis
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的分布式锁的功能组件(二)
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的分布式锁的功能组件
15 0
|
2月前
|
SQL 存储 数据管理
数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
36 1
|
2月前
|
移动开发 前端开发 C#
MVVM风格架构
MVVM风格架构
28 2
|
3月前
|
消息中间件 架构师 NoSQL
以架构师的视角,深入剖析如何设计订单超时自动取消的功能
我们在美团 APP 下单,假如没有立即支付,进入订单详情会显示倒计时,如果超过支付时间,订单就会被自动取消。 这篇文章,笔者想以架构师的视角,深入剖析如何设计订单超时自动取消的功能。
以架构师的视角,深入剖析如何设计订单超时自动取消的功能
|
3月前
|
前端开发 JavaScript API
|
4月前
|
设计模式 存储 前端开发
【各种问题处理】MVC、MVP、MVVM 、MVI、VIPER 架构(设计模式)
【1月更文挑战第13天】【各种问题处理】MVC、MVP、MVVM 、MVI、VIPER 架构(设计模式)
|
19小时前
|
Kubernetes API 开发者
构建高效微服务架构:后端开发的新范式
【5月更文挑战第2天】 随着现代软件开发的演进,传统的单体应用已难以满足快速变化的业务需求和敏捷开发的挑战。本文探讨了如何通过构建高效的微服务架构来提升后端开发的灵活性、可维护性和扩展性。我们将深入分析微服务的核心组件,包括服务拆分、容器化、API网关和持续集成/持续部署(CI/CD)等关键技术,并讨论它们如何共同作用以支持复杂的业务场景和云原生应用的需求。
6 1
|
19小时前
|
负载均衡 Java API
构建高效微服务架构:API网关与服务熔断策略
【5月更文挑战第2天】 在微服务架构中,确保系统的高可用性与灵活性是至关重要的。本文将深入探讨如何通过实施有效的API网关和设计合理的服务熔断机制来提升分布式系统的鲁棒性。我们将分析API网关的核心职责,包括请求路由、负载均衡、认证授权以及限流控制,并讨论如何利用熔断器模式防止故障传播,维护系统的整体稳定性。文章还将介绍一些实用的技术和工具,如Netflix Zuul、Spring Cloud Gateway以及Hystrix,以帮助开发者构建一个可靠且高效的微服务环境。