angularjs和ajax的结合使用 (二)

早些年,我总会再也地做一些梦。

今天我们来连续增长上次的例子。大家来搞些 稍微复杂点的施用。

像是姥姥家那一只慵懒的老猫趴在木质的窗柩边晒着傍晚没精打采的日光,眯着它的眼眸,又日常地闭上。它的眼角永远有些粘稠的事物,像是一辈子流不尽的泪水堆积成岁月的眉眼。或是幼儿园的操场上,班里特别疯疯癫癫的男生在大家前面穷追不舍,我蓄意地从二哥身边跑过,还不忘尖叫两声。抑或是在非常寒冷的早晨,树叶凋落得全部社会风气只剩下光秃秃的枝桠。我牵着大姨的手,走在三姑家门前这条长长陡陡的台阶上,她站在门户前,头发被风吹得凌乱不堪,胸前因为心脏病而身着的一朵鲜藏红色的简单花朵随着寒风颤巍。她接近是在对自己说,你这孩子,快回来妈妈跟你玩。又像是在说,你可好赏心悦目着路,别摔倒,一定记着再来看自己。而自己,只顾着前进走,嘴里答应着,却不回头。

第一我们来加一个全选 的功能。

这段日子,这个梦,就像是早上融于我身体的一有的。不知是挥之不去,仍旧自身,不愿屏弃。

上一篇的事例里我们看到 分页时载入的是大家经过linq 查询自定义列
然后构建的匿名类 。使用这种EF框架+linq 查询的章程 我认为不便利的少数就是
要不您就只好select 一个稳定对应表的数据模型类名
,可是系列化成json的时候对外键类引用有天然的bug 
,就是框架自动序列化成json格式时会出循环引用错误
。系列化类型为XX的对象时检测到循环引用。没办法
我们能做的就是遮掩某些属性
。情势就是在字段属性上方加上[AjaxPro.AjaxNonSerializable] 光这样还丰富如若 字段属性 有 virtual 关键字 还会报错,可是EF写数据模型代码的时候
外键属性如若不加virtual 修饰 就相当于废的
外键抓可是来的。真是令人蛋疼的题材。大多数状态我们询问都不会只询问单一表的数据
并且基本如故用匿名类的章程 想用什么字段用什么字段
外键也可以即刻查询出来 。综合下边的题目 仍然用匿名类的不二法门 。

时刻一晃好些年,那个梦好久都未曾再出新过,以至于当梦境中的人们重现在自我后边时,会让我隐约间觉得他们是上一世的记得。当然,婶婶只会再出新在梦里。这只老猫,也已经成为泥土的一部分了啊。

 假诺您期望客户端传回来的数量对象 自动连串化成你的C#数据模型类
。也稍微需要注意的地点 除了地方我说的 ,还有:
1无法用Ilist 直接运用List 数组没试过 好像也不行 。

自家是在百货公司的转角处际遇堂哥的,他身后是三姑舅舅家的小叔子表嫂们。阿姨家的大姐说,好久不见了,我们该聚聚了。

2为了你传到客户端的json数据 又能够无缝的散播来。
在应用匿名类linq情势查询的时候
假诺你想从客户端自动体系化成你C#数量模型类的属性
那么您就把匿名查询时的字段名称写成一样。

嗯。也好。

3字段并不一定要逐个完整对应 
框架会检查你服务端接收参数的数据模型类有哪些字段
然后从再次来到的json数据里找 不相符的字段 他不会管的 并且也不会报错
只找json数据里符合的字段 然后连串化成 你c#数据模型类 
这一点自己以为框架处理的非凡好 十分智能。比如下面全选 的效能我就给表格上绑的多寡多加了一列 列名为chk 类型为bool 为true 则当选 
没有那一个字段 或者为false 都为没选中,

说实话,我首先眼并没有认出三弟来。在自家的回忆里,他还仍是极度八九岁的小男孩,可站在自身面前的是一个十八岁的少年。

4并且javascript这么些很烂的事物 有个便宜就是 变量可以灵活的选拔无类型限制。比如可以轻易定义json格式的多少var person={name:”xiang”} 
定义完过后 可以连续在其基础上添加内容 像这样 person.chk=true 。

嗯,原来已经仙逝那一个年。

俺们做这么些效率正是利用了上述原理。

不怕我不愿意认同,可自我仍旧更欣赏十年前的她。
这时候,他的指头没有烟草的脾胃。没有中午在网吧熬夜打游戏留下的漠然黑眼圈。这时候的她是这样的仅仅干净,就像一张白纸。像他那白皙的脸孔。在很久很久在此以前,我们俩家只隔着一条巷子。我家在巷子这端,他从那端来找我,“四妹”“表妹”地叫着,整条胡同的人都能听到。他会和自身打羽毛球,然后把她的QQ号密码给自身让我帮他挂着,我还记得这是一串长长的却有规律的字符,他告知我,假设她们班那一个男生假诺骂他的话就帮她骂回去,不开口就不开口好了。其实,我有史以来没有帮她登过三遍。因为我总觉得,将来,有的是机会。

报表头部加个 全选效能的复选框

自己叫了她一声“哥”,他笑笑,点点头。

1 <th>
2                                 <input id="Checkbox1" ng-click="selectAll($event)" type="checkbox" />全选
3                                 
4                             </th>

就餐唱歌的时候,他像是试着跟自家说过四次话,可一句答完事后,便没了下条。

都了解在javascript里面 调用函数时 要把近年来单击的控件对象传进去
使用this ,angularjs 里面不均等 使用$event
。那么相应的效能函数又是什么样的吗

或许这便是所谓亲人之间最好的混杂吧。知道互相的面相,却不进来相互的生存,所谓的美好,存活于已经,封存在记念。

 1 //全选
 2 $scope.selectAll = function (sender) {
 3     if ($(sender.target).is(':checked')) {
 4         for (var i = 0; i < $scope.data.length; i++) {
 5             $scope.data[i].chk = true;
 6         }
 7     }
 8     else {
 9         for (var i = 0; i < $scope.data.length; i++) {
10             $scope.data[i].chk = false;
11         }
12     }
13 }

见过面后的这天夜里,我又做了这么些梦,这只老猫安静地闭着双眼一动不动,小弟放出手中的游乐拦住了那些男生,威逼了她几句,然后指着他冲我喊不用怕他。我也终于听理解了小姑在说怎么。她说,我这么久没见你了,你怎么就走了吧。

接下来再行循环之中 弄个复选框的双向绑定就足以了

是呀,大家好久不见,不过你们,怎么都走了吗。

1 <td>
2     <input ng-checked="{{stu.chk}}" ng-model="stu.chk" type="checkbox" /></td>

看 就足以了 虽然我们回传的数额多了个chk属性
然则仍是可以够被成功解析成StudentsInfo对象。angularjs里面特别讲究数据操作跟界面上的照应关系
 让您的顺序更为面向对象化。

接下去我们来说下一些常用的数额格式化情势。angularjs里面自带了一些自带的filter
可提供格式化日期 那些 {{ stu.createDate | date: ‘yyyy年MM月dd’ }}

找了下没找到格式化布尔值的点子。还协调写了个filter:

 1 app.filter('odditems', function () {
 2     return function (inputArray) {
 3         if (inputArray == true)
 4             return '是';
 5         else if (inputArray == false)
 6             return '否';
 7         else
 8             return '空';
 9     }
10 });

新生证实完全是自身多虑了 ,原来angularjs的发布式 也补助三元运算
:{{stu.isChecked==true?’yes’:”}}
接下去继续壮大下面的事例 来加个复选项的功效

最广大的这种就是爱护  你有神马爱好 打篮球 羽毛球 游泳 ,哇哈哈 ,
别打我。这是一个多对多的涉及 可能会想到专门建一个表来存储那一个东西
,用不着啦 。间接加个文本字段 以逗号隔开就可以了。

先出示一个网上的一个复选功用的事例:

图片 1图片 2

 1 <body ng-app="app">
 2     <div ng-controller="MainCtrl" class="container bg-color">
 3         <section>
 4             <pre>{{choseArr}}</pre>
 5             全选: <input type="checkbox" ng-model="master" ng-click="all(master,tesarry)">
 6             <div ng-repeat="z in tesarry">
 7                 <input id={{z}} type="checkbox" ng-model="x" ng-checked="master" ng-click="chk(z,x)">{{z}}
 8             </div>
 9             <a href="#" class="btn btn-danger" ng-click="delete()"> 删除</a>
10         </section>
11     </div>
12     <script>
13         var app = angular.module('app', []);
14         app.controller('MainCtrl', function ($scope, $http, $timeout) {
15             $scope.tesarry = ['1', '2', '3', '4', '5'];//初始化数据
16             $scope.choseArr = [];//定义数组用于存放前端显示
17             var str = "";//
18             var len = $scope.tesarry.length;//初始化数据長度
19             var flag = '';//是否点击了全选,是为a
20             $scope.x = false;//默认未选中
21 
22             $scope.all = function (c, v) {//全选
23                 if (c == true) {
24                     $scope.x = true;
25                     $scope.choseArr = angular.copy(v);
26                     flag = 'a';
27                 } else {
28                     $scope.x = false;
29                     $scope.choseArr = [];
30                     flag = 'b';
31                 }
32             };
33             $scope.chk = function (z, x) {//单选或者多选
34                 if (flag == 'a') {//在全选的基础上操作
35                     str = $scope.choseArr.join(',') + ',';
36                 }
37                 if (x == true) {//选中
38                     str = str + z + ',';
39                     flag = 'c'
40                     if ($scope.choseArr.length == len - 1) {
41                         $scope.master = true
42                     }
43                 } else {
44                     str = str.replace(z + ',', '');//取消选中
45                 }
46 
47                 $scope.choseArr = (str.substr(0, str.length - 1)).split(',');
48                 var dex = $scope.choseArr.indexOf("");//判断数组中有没有"",有的话返回值大于等于0,没有返回-1
49                 if (dex >= 0) {
50                     $scope.choseArr.splice(dex, 1);//删除数组中的"";
51                 };
52                 if ($scope.choseArr.length == 0) { $scope.master = false };
53             };
54             $scope.delete = function () {// 操作CURD
55                 if ($scope.choseArr[0] == "" || $scope.choseArr.length == 0) {//没有选择一个的时候提示
56                     alert("请至少选中一条数据在操作!")
57                     return;
58                 };
59                 for (var i = 0; i < $scope.choseArr.length; i++) {
60                     alert($scope.choseArr[i]);
61                     console.log($scope.choseArr[i]);//遍历选中的id
62                 }
63             };//delete end
64         });
65     </script>
66 
67 </body>

View Code

本人也不想多说 ,又叫变量又加这么这样处理的 。麻烦
复杂。我还不如直接用jquery呢。angularjs一贯的眼光就是 只关心数据模型。
其实你需要的是这样一种格式的东西:

$scope.ar = [{ id: 1, name: “basketball”, st: true }, { id: 2, name:
“tennis”, st: false }, { id: 3, name: “swimming”, st: true }];

st代表入选与否 id代表复选项的value值 name代表复选项的text值
然后用repeat一循环 是不是这么  是不是应该如此:

图片 3图片 4

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 5     <title>多选</title>
 6     <script type="text/javascript" src="../jquery-easyui-1.4.3/jquery.min.js"></script>
 7     <script type="text/javascript" src="../angularJs/angular.js"></script>
 8     <script>
 9         function myCtr($scope) {
10             //实现多选 看了网上的一个 又是弄中间变量 又是操作dom
11             //no 数据 组织方式  这才是angular way   ,根本不需要那么多操作 只需要操作数据 你只需要操作数据  看简简单单 清清爽爽
12             //按说的话这种需求是比较少的 如果设计功能的时候 你非要整这么个 那么没办法 数据结构就是这样 你就得这么做 别想偷懒
13             //你必须得形成这样一种数据结构了 交给前端 
14             $scope.ar = [{ id: 1, name: "basketball", st: true }, { id: 2, name: "tennis", st: false }, { id: 3, name: "swimming", st: true }];
15             $scope.ar2 = [2, 3];
16             $scope.exist = function (id) {
17                 for (var i = 0; i < $scope.ar2.length ; i++) {
18                     if ($scope.ar2[i] == id)
19                         return true;
20                 }
21                 return false;
22             }
23             $scope.show = function () {
24                 var rst = "";
25                 for (var i = 0; i < $scope.ar.length ; i++) {
26                     if ($scope.ar[i].st == true)
27                         rst += $scope.ar[i].name + ',';
28                 }
29                 alert(rst);
30             }
31         }
32     </script>
33 </head>
34 <body ng-app ng-controller="myCtr">
35     <ul>
36         <li ng-repeat="z in ar">
37             <input id="chk{{z.id}}" ng-checked="{{z.st}}" ng-model="z.st" type="checkbox" />
38             <label for="chk{{z.id}}">{{z.name}}</label>
39         </li>
40     </ul>
41     <hr />
42     <ul >
43         <li ng-repeat="z in ar">
44             <input id="chkk{{z.id}}" ng-checked="exist(z.id)" ng-model="z.st" type="checkbox" />
45             <label for="chkk{{z.id}}">{{z.name}}</label>
46         </li>
47     </ul>
48 
49     <input id="Button1" type="button" ng-click="show()" value="show" />
50    
51 </body>
52 </html>

View Code

为了拿走上述这种格式的数据 本来在服务端编写这样的代码 以属性的方法突显:

 1 public List<CheckboxItem> favorsValue
 2 {
 3     get
 4     {
 5         if(_favorsValue!=null)
 6             return _favorsValue;
 7         else if (string.IsNullOrEmpty(favors)==false)
 8         {
 9             Dal d = new Dal();
10             List<CheckboxItem> flist = d.GetAllFavors();
11             string[] curlist = favors.Split(',');
12             for (int i = 0; i < flist.Count; i++)
13             {
14                 for (int j = 0; j < curlist.Length; j++)
15                 {
16                     if (flist[i].id == curlist[j])
17                     {
18                         flist[i].Checked = true;
19                         continue;
20                     }
21                 }
22             }
23             return flist;
24             //return favors.Split(',');
25         }
26         else
27         {
28             Dal d = new Dal();
29             List<CheckboxItem> flist = d.GetAllFavors();
30             return flist;
31         }
32     }
33     set {
34         _favorsValue = value;
35     }
36    
37 }

譬如我们有两种不同的爱好 那么把从数据库里都出来
,然后依据每条数据各自不同的以逗号隔开的字符 转换成

$scope.ar = [{ id: 1, name: “basketball”, st: true }, { id: 2, name:
“tennis”, st: false }, { id: 3, name: “swimming”, st: true }];

这般的多寡  。然后前端拿到的自行就是这种格式的数据了
操作后又跟后端做到无缝对接。想法是好的总会碰到各种题材
这种属性逻辑代码必须写在对应的数据模型代码里 给linq查询带来了限制。
假如运用匿名类的措施做linq查询又调用不了这么些逻辑
匿名类是调用持续逻辑代码的 只能做简单的起初化属性的工作
。为了在匿名类里调用方法本身都找疯了 结果或者没找到,最终依旧妥协了
把这多少个工作嵌入客户端去处理。

 1 //多选框绑定
 2             $scope.transFav = function () {
 3                 if ($scope.curobj.favorsValue != null && $scope.curobj.favorsValue != undefined)
 4                     return;
 5                 if ($scope.curobj.favors) {
 6 
 7                     var d = [{ id: "1", name: "basketball", Checked: false }, { id: "2", name: "tennis", Checked: false }, { id: "3", name: "swimming", Checked: false }];
 8                     var curlist = $scope.curobj.favors.split(",");
 9                     for (var i = 0; i < d.length; i++) {
10                         for (var j = 0; j < curlist.length; j++) {
11                             if (d[i].id == curlist[j]) {
12                                 d[i].Checked = true;
13                                 continue;
14                             }
15                         }
16                     }
17                     $scope.curobj.favorsValue = d;
18                 }
19                 else {
20                     var d = [{ id: "1", name: "basketball", Checked: false }, { id: "2", name: "tennis", Checked: false }, { id: "3", name: "swimming", Checked: false }];
21                     $scope.curobj.favorsValue = d;
22                 }
23             }

可是在劳动端属性咱们如故当着这么一个属性 public List<CheckboxItem>
favorsValue{ get; set; }
让客户端转移数据后回传可以完成无缝衔接。客户端数据绑定:

1 <ul>
2     <li ng-repeat="z in  curobj.favorsValue">
3         <input id="chkk{{z.id}}" ng-checked="z.Checked" value="{{z.id}}" name="favorchk" ng-model="z.Checked" type="checkbox" />
4         <label for="chkk{{z.id}}">{{z.name}}</label>
5     </li>
6 </ul>

客户端转移favorsValue的情节服务端可获知
然后再也协会成逗号隔开的字符串。当然这么些工作你在客户端做也是足以的:

 1 //根据name 获得所有checkbox选取的的值
 2 function addMem(names) {
 3     var allNames = "";
 4     $("input[name='" + names + "']").each(function () {
 5         if ($(this).attr("checked") == "checked") {
 6             if (allNames == "") {
 7                 allNames = $(this).attr("value");
 8             } else {
 9                 allNames += "," + $(this).attr("value");
10             }
11         }
12     });
13     //alert(allNames);
14     return allNames;
15 }

运转效果:

图片 5

源码文件或者基于上一篇更改,直接下载上一篇的源码即可。