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

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

说在前

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

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

做在后

Html代码

  1. <tableclass="listTbl">
  2. <thead>
  3. <tr>
  4. <tdwidth="100"></td>
  5. <td>ID</td>
  6. <td>姓名</td>
  7. <td>电子邮件</td>
  8. </tr>
  9. </thead>
  10. <tbodydata-bind="foreach:UserList">
  11. <tr>
  12. <td>
  13. <ahref="javascript:;"data-bind="click:$parent.del">删除</a>
  14. <ahref="javascript:;"data-bind="click:$parent.edit">编辑</a>
  15. </td>
  16. <tddata-bind="text:UserInfoID"></td>
  17. <tddata-bind="text:UserName"></td>
  18. <tddata-bind="text:Email"></td>
  19. </tr>
  20. </tbody>
  21. </table>
  22. <scripttype="text/html"id="editUserDiv">
  23. <form style="width: 500px;" id="editUser" data-bind="with:selectUser">
  24. <div class="editor-label">
  25. 账号:
  26. </div>
  27. <div class="editor-field">
  28. <input type="hidden" name="UserInfoID" data-bind=‘value: UserInfoID‘/>
  29. <input name="UserName" data-bind=‘value: UserName‘/>
  30. </div>
  31. <div class="editor-label">
  32. Email:
  33. </div>
  34. <div class="editor-field">
  35. <input name="Email" data-bind=‘value: Email‘/>
  36. </div>
  37. <div class="editor-label">
  38. 手机:
  39. </div>
  40. <div class="editor-field">
  41. <input name="Phone" data-bind=‘value: Phone‘/>
  42. </div>
  43. <div class="editor-label">
  44. 密码:
  45. </div>
  46. <div class="editor-field">
  47. <input name="Password" data-bind=‘value: Password‘/>
  48. </div>
  49. <div class="editor-label">
  50. 真实姓名:
  51. </div>
  52. <div class="editor-field">
  53. <input name="RealName" data-bind=‘value: RealName‘/>
  54. </div>
  55. <div style="clear: both;"></div>
  56. <p>
  57. <input type="button" value="Save" data-bind="click:$parent.save"/>
  58. </p>
  59. </form>
  60. </script>

JS代码

  1. <scripttype="text/ecmascript">
  2. function toVal(obj){
  3. if(typeof obj =="function")
  4. return obj();
  5. else
  6. return obj;
  7. }
  8. varModel=function(){
  9. //properies
  10. var self =this;
  11. ko.validation.configure({//ko.validation相关配置
  12. insertMessages:true//不自动插入错误消息
  13. });
  14. self.UserList= ko.observableArray(@Html.Raw(Json.Encode(Model)));
  15. self.selectUser = ko.observable();
  16. //methods
  17. self.del =function(o){
  18. Boxy.confirm("are you sure?",function(){
  19. $.post("/ef/DelAjaxPost?userinfoID="+ o.UserInfoID,function(data){
  20. alert(data ==true?"成功":"失败");
  21. self.UserList.remove(o);
  22. });
  23. });
  24. }
  25. self.edit =function(o){
  26. $(".boxy-wrapper").empty()//关闭之前的弹框
  27. newBoxy($("#editUserDiv").html(),{
  28. afterShow:function(){//弹出框这前,绑定数据到弹框元素上
  29. //属性验证
  30. o.Phone= ko.observable(toVal(o.Phone)).extend({ required:true});/*先将要验证的字段变成ko对象,并添加扩展验证特性*/
  31. o.Email= ko.observable(toVal(o.Email)).extend({ required:true});
  32. o.RealName= ko.observable(toVal(o.RealName)).extend({ required:true});
  33. o.Password= ko.observable(toVal(o.Password)).extend({ required:true});
  34. o.UserName= ko.observable(toVal(o.UserName)).extend({ required:true});
  35. //绑定对象到ko
  36. self.selectUser(o);
  37. //绑定对象到页面
  38. ko.applyBindings(self, document.getElementById("editUser"));
  39. }, modal:true, title:"提示", closeText:"x"
  40. });
  41. }
  42. self.save =function(o){
  43. self.errors = ko.validation.group(o);
  44. if(o.isValid()){
  45. $.post("/EF/EditAjaxPost", $("form").serialize()/*这个方法必须使input有name属性,只有id属性不行*/,function(data){
  46. location.href ="/ef/userlist";
  47. });
  48. }else{
  49. self.errors.showAllMessages();
  50. }
  51. }
  52. }
  53. var M =newModel();
  54. ko.applyBindings(M);
  55. </script>

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

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

MVVM架构~使用boxy和knockoutjs实现编辑功能,布布扣,bubuko.com

时间: 2024-12-30 17:56:38

MVVM架构~使用boxy和knockoutjs实现编辑功能的相关文章

MVVM架构~knockoutjs系列之为Ajax传递Ko数组对象

返回目录 一些要说的 这是一个很有意思的题目,在KO里,有对象和数组对象两种,但这两种对象对外表现都是一个function,如果希望得到他的值,需要进行函数式调用,如ko_a(),它的结果为一个具体值或者数组或者函数,而ko_a则表示一个KO对象. 今天主要说一下如何在ajax方法里向后台传递对象和数组等参数,一般说来,我们为后台传递的是字符串和数字,而如果希望传递对象,则需要使用$.param这个方法,下面具体用代码说一下. 一些要做的 一般后以的代码理想是这样的 public JsonRes

MVVM架构~knockoutjs系列之扩展ajax验证~验证输入数据是否与后台数据相等

返回目录 在看这篇文章之前,你有必要先看我之前的文章,之前文章是将一个方法以参数的形式传给KO,然后返回一个真假值,去做验证,这类似于面向对象语言里的委托,在JS里我们叫它回调方法,本篇文章与前一文章不同,需要有两个参数,其一是远程方法的签名(JS方法),其二是已知要比较的数据(可能是加密后的密码数据),当用户输入文字后,它将会调用JS方法获取远程数据,以比较原数据与你输入的数据是否匹配. 知识点:以对象作为参数进行传递 ko.validation.js的扩展 //ajax相等验证 kv.rul

[转]MVVM架构~mvc,mvp,mvvm大话开篇

MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller. 在MVC里,View是可以直接访问

IOS面向协议的MVVM架构介绍(来着网络的链接)

https://academy.realm.io/cn/posts/doios-natasha-murashev-protocol-oriented-mvvm/   面向协议的 MVVM 架构介绍 http://www.cocoachina.com/ios/20160108/14911.html    猿题库 iOS 客户端架构设计

WPF MVVM 架构 Step By Step(6)(把actions从view model解耦)

到现在为止,我们创建了一个简单的MVVM的例子,包含了实现了的属性和命令.我们现在有这样一个包含了例如textbox类似的输入元素的视图,textbox用绑定来和view model联系,像点击button这样的行为用命令来联系.view model和model在内部通信. 但是在上面的架构中有一个问题,command类和view model有很严重的耦合.如果你记得command类的代码(在下面也有展示),在构造函数中传递view model对象,意味着这个command 类不能再其他的vie

ReactiveCocoa常见操作方法介绍/MVVM架构思想

1.ReactiveCocoa常见操作方法介绍. 1.1 ReactiveCocoa操作须知 所有的信号(RACSignal)都可以进行操作处理,因为所有操作方法都定义在RACStream.h中,因此只要继承RACStream就有了操作处理方法. 1.2 ReactiveCocoa操作思想 运用的是Hook(钩子)思想,Hook是一种用于改变API(应用程序编程接口:方法)执行结果的技术. Hook用处:截获API调用的技术. Hook原理:在每次调用一个API返回结果之前,先执行你自己的方法,

MVVM架构简单介绍

MVVM架构简单介绍 1 程序为什么要架构:便于程序员开发和维护代码. 2 常见的架构思想: MVC M:模型 V:视图 C:控制器 MVVM M:模型 V:视图+控制器 VM:视图模型 MVCS M:模型 V:视图 C:控制器 C:服务类 VIPER V:视图 I:交互器 P:展示器 E:实体 R:路由 (http://www.cocoachina.com/ios/20140703/9016.html) 3 MVVM介绍 模型(M):保存视图数据. 视图+控制器(V):展示内容 + 如何展示

为MVC瘦身——iOS的MVVM架构与ReactiveCocoa框架

MVC = Massive View Controller ? 有笑话称MVC为重量级的试图控制器.仔细一想,确实存在这个问题.以UITableViewController和UITableView举个例子. 一般情况下,我们没有必要创建一个自定义的tableview继承自UITableView.这意味着View的模块几乎为空白.(在相当多的时候,view也仅是一个xib文件或者一堆代码用来描述控件外观和控件的位置而已).至于Model,十分类似于JavaBean,一个类,若干属性和constru

浅谈MVC、MVP、MVVM架构模式的区别和联系

浅谈MVC.MVP.MVVM架构模式的区别和联系 学习了:http://www.cnblogs.com/guwei4037/p/5591183.html http://blog.csdn.net/ttf1993/article/details/49405329 MVC: Model->View->Controller->Model MVP: View <--> Presenter <--> Model MVVM: View (ViewController)<