angularjs和ajax的結合使用 (一)


好久沒寫文了。這是一篇關於easyui配合ajax使用 的文章, 順帶介紹angularjs的使用 以及讓你感受到angularjs的威力。網上對於ajax 的文也是多如牛毛 。我就不直接 從那種原生的httpxmlrequest 對象的js 寫起了哈。 看那種東西也存粹是了解 高層的東西是怎么來的 原理是啥 真正做的時候寫那種東西 不是扯淡么  你叼 你技術牛逼 整站的代碼你全用那種寫。html js 這種東西最開始設計出來就沒考慮周全 就是坨屎。還好現在有各種框架 可以幫助我們更容易的把這坨屎做的更美味。也還好由於互聯網事業如日中天 的推動 讓瀏覽器端的這堆東西正在往統一規范的方向發展。 好了 正題。

 

我們來建立一個webform頁面 HelloAjaxNet.aspx。先說下ajax 這里我使用網上流傳甚廣的那個AjaxPro.2.dll  他的網站是 http://www.ajaxpro.info/ 這是一個個人作品 ,很好用。

本來新的asp.net 里自帶了 服務端方法用webmethod 屬性聲明  客戶端pagemethods訪問 的方式 ,各種對象也可以json數據化 ,功能跟上面一樣的。微軟自帶的是aspx的codebehind 代碼方法 一定要加static  ,至於webconfig 在新版的vs2013開發環境下無須配置 如果是老的則新建ajax網站項目則webconfig自動弄好了然后服務端頁面載入事件中 ScriptManager.GetCurrent(Page).EnablePageMethods = true; 客戶端 必須有runat=server 的form 和 <asp:ScriptManager ID="ScriptManager1" runat="server">        </asp:ScriptManager>  然后客戶端就可以pagemethods 的方式訪問。

我始終還是認為上面那個更好用 。關於他的原理我就不多說了  ,通過頁面載入時注冊服務端對象 ,然后生成的html頁面上就多了這么幾句

1 <script type="text/javascript" src="/ajaxpro/prototype.ashx"></script> 2 <script type="text/javascript" src="/ajaxpro/core.ashx"></script> 3 <script type="text/javascript" src="/ajaxpro/converter.ashx"></script> 4 <script type="text/javascript" src="/ajaxpro/WebApplication1.StudentsInfo,WebApplication1.ashx"></script> 5 <script type="text/javascript" src="/ajaxpro/WebApplication1.Grad,WebApplication1.ashx"></script> 6 <script type="text/javascript" 
src="/ajaxpro/WebApplication1.NewFolder2.HelloAjaxNet,WebApplication1.ashx"></script> 7 <script type="text/javascript" src="/ajaxpro/WebApplication1.DataEntity,WebApplication1.ashx"></script>

為是什么呢 為的是引用一段js文件 ajaxpro/WebApplication1.NewFolder2.HelloAjaxNet,WebApplication1.ashx  

然后你就明白了噻 這段客供你進行客戶端js調用的腳本 是服務端自動生成的 跟你 服務端的名字一模一樣 然后你就可以貌似像在客戶端回調服務端方法樣的 沒什么神奇的,我們主要就是想利用他的這個特性和json化數據的方便之處 來實現客戶端服務端數據的無縫傳遞。

關於json數據的序列化 要是以前就只有利用外部json庫 或者微軟自帶的來進行手動解析:

服務端:

 1 public string ServerProcerMethod4(string stu)  2  {  3 //System.Web.Script.Serialization.JavaScriptSerializer jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();  4 //StuInfo s= jsSerializer.Deserialize<StuInfo>(stu);  5  6 System.Web.Script.Serialization.JavaScriptSerializer jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();  7 List<StuInfo> s = jsSerializer.Deserialize<List<StuInfo>>(stu);  8 if (s != null && s.Count > 0)  9  { 10 StuInfo stu2= s[0]; 11 StringBuilder sb = new StringBuilder(); 12  jsSerializer.Serialize(stu2, sb); 13 return sb.ToString(); 14  } 15 else 16 return null; 17 }

客戶端:

1 //javascript 字符串轉json對象:
2 
3 var obj = JSON.parse(str);
4 
5 //javascript json 對象轉字符串:
6 
7 JSON.stringify(obj);

 

關於AjaxPro.2.dll  和ajax.dll的關系 ,網上說他們不一樣 其實壓根就是一個人搞的吧 我擦 。請在上面網站下載ajaxpro 這個才是完善的版本

引用dll文件后需要配置webconfig httphandler 作用就是讓 上面的ashx請求轉到我們的 ajaxpro代碼 ,進而讓我們的客戶端js直接調用服務端方法調用成功。

1 <system.webServer>
2     <directoryBrowse enabled="true"/>
3     <handlers>
4       <add verb="*" path="*.ashx" name="myhandler" type="AjaxPro.AjaxHandlerFactory,AjaxPro.2"/>
5       
6       <!--<add verb="POST,GET" path="ajax/*.ashx" name="myhandler" type="Ajax.PageHandlerFactory, Ajax" />-->
7     </handlers>
8   </system.webServer>


然后其他的我就不多說了哈待會直接看服務端代碼。

 

easyui 你就可以理解為一堆擴展了的控件。就像jquery一樣 你把js對象 原生的html控件用他的東西一包 然后就可以點得出他一些為你寫好的方法 幫助你方便的處理數據。並且還有默認的還可以的控件外觀,這點對於做企業管理類軟件來說 還是真心不錯的,做其他的就只能呵呵了。下載easyui的文件 放到項目中 並引入easyui 相關js和樣式文件 還有jquery:

1     <script type="text/javascript" src="../jquery-easyui-1.4.3/jquery.min.js"> </script>
2     <link rel="stylesheet" type="text/css" href="../jquery-easyui-1.4.3/themes/default/easyui.css" />
3     <link rel="stylesheet" type="text/css" href="../jquery-easyui-1.4.3/themes/icon.css" />
4     <script type="text/javascript" src="../jquery-easyui-1.4.3/jquery.easyui.min.js"></script>

 

然后 ,然后你就可以使用easyui了 就像easyui 首頁 http://jeasyui.com/ 上介紹的那樣 通過css樣式 或者js代碼 把原生html控件渲染成easyui控件

1 <div class="easyui-dialog" style="width:400px;height:200px"
2     data-options="
3         title:'My Dialog',
4         iconCls:'icon-ok',
5         onOpen:function(){}">
6     dialog content.
7 </div>
1 <input id="cc" style="width:200px" />
2 
3 $('#cc').combobox({
4     url: ...,
5     required: true,
6     valueField: 'id',
7     textField: 'text'
8 });


是的 非常方便。其實國內還有好些js寫的比較牛的 弄了一些這樣ui 那樣ui 選來選去還是用這個吧。用的最多的需求就是ajax服務端分頁 ,我們來弄個吧。

我們先說下這個easyui的datagrid  打他狗日的,客戶端html放個table標簽 :<table id="studb"></table> 然后用js這么一搞 $('#studb').datagrid() 他就給你渲染成easyui datagrid控件了 ,你可以在document.ready()時做這個事情。我們的數據表格是需要填充數據的 這些數據從哪來 顯示哪些列 怎么分頁 每頁顯示多少條,這些都是參數,怎么傳進去。easyui很多地方都接收json對象形式的一坨參數 ,比如這個datagrid:

 1 function bindDataToTb() {
 2             var keywordStr = $('#keyword').val();
 3             $('#studb').datagrid(
 4            {
 5                queryParams: { keyword: keywordStr },
 6                //url:"WebForm2.aspx/BindData",
 7                toolbar: '#searchBar',
 8                pagination: true,
 9                pageNumber: 1,
10                singleSelect: true,
11                pageSize: 5,
12                pageList: [5, 10, 20],
13                loader: function (param, success, error) {
14                    var da = WebApplication1.NewFolder2.HelloAjaxNet.BindData(param.keyword, param.page, param.rows)
15                    if (da.value.rows == null) {
16                        success();
17                    }
18                    else
19                        success(da.value);
20                },
21                pagePosition: 'bottom',
22                columns: [[
23                    { field: 'stuNo', title: 'Id', width: 100 },
24                    { field: 'name', title: '名字', width: 100 },
25                    { field: 'age', title: '年齡', width: 100 },
26                    { field: 'loginName', title: '登錄名', width: 100 },
27                    { field: 'loginPwd', title: '密碼', width: 100 },
28                    { field: 'GradId', title: '班級Id', width: 100 },
29                    { field: 'gradName', title: '班級', width: 100 },
30                    {
31                        field: 'none', title: '操作', width: 100, formatter: function (value, row, index) {
32                            var btn = '<a class="editcls" href="#" onclick="delstuClick(' + row.stuNo + ')">刪除</a>';
33                            return btn;
34                        }
35                    }
36                ]]
37            });
38 
39         }


具體看loader 和columns ,loader用於定義你以什么形式載入數據 定義了loader上面的url就沒有必要了。

我這里的WebApplication1.NewFolder2.HelloAjaxNet.BindData(param.keyword, param.page, param.rows) 自然也是服務端的方法 用於檢索數據的 。

關於這三個param.keyword, param.page, param.rows 是我們用於實現loader時 easyui那種設計方式故意暴露給我們的參數 方便我們使用。

param.keyword 是我們上面定義的 我們點搜索的時候需要往服務端傳一個查詢關鍵詞 queryParams: { keyword: keywordStr }

param.page 是easyui自己的參數表示當前第幾頁 param.rows表示每頁行數,每當你 點表格的 上一頁 下一頁 的時候 就會自動往loader 發翻頁的參數 這個是自動的。

然后就從服務端獲取數據填充表格 ,就是這么一個工作過程。 還有colums 我就不說了就是定義顯示哪些列 和自定義列 那個很容易看懂。

easyui控件有屬性 方法,調用方法 的形式總算像這樣 :$('#studb').datagrid('reload')  這就相當於調用了#studb這個表格控件的reload方法了 然后數據就會自動刷新,每個控件的具體見文檔。

服務端數據處理我們還是用entityframework 我一般都用codefirst的方式 這東西跟他自己的mssql數據庫 結合的很好 用起很方便。

 

服務端代碼:

 1 //查詢(帶分頁  2  [AjaxPro.AjaxMethod]  3 public static WebApplication1.DataEntity BindData(string keyword, int page, int rows)  4  {  5 //, ref int pageIndex, out int totalPage  6  7 if (keyword == null)  8 keyword = "";  9 10 int pageIndex = 1; 11 int pageSize = 3; 12 int totalPage; 13 if (page != 0) 14 pageIndex = page; 15 if (rows != 0) 16 pageSize = rows; 17 18 MyDb db = new MyDb(); 19 var data = from studentInfo in db.Students where studentInfo.name.Contains(keyword) select new 
{ stuNo = studentInfo.stuNo, name = studentInfo.name, age = studentInfo.age, gradName = studentInfo.grad.gradName }; 20 //var data = from studentInfo in db.Students where studentInfo.name.Contains(keyword) select studentInfo; 21 22 totalPage = data.Count() % pageSize == 0 ? data.Count() / pageSize : data.Count() / pageSize + 1; 23 24 if (pageIndex > totalPage) 25 pageIndex = totalPage; 26 else if (pageIndex < 1) 27 pageIndex = 1; 28 29 //var dt = DataList<object>.Create(data.OrderBy(r => r.stuNo), new StudentsInfo(), pageIndex, pageSize).Value; 30 object dt=null ; 31 if(data.Count()>0) 32 dt= DataList<object>.Create(data.OrderBy(r => r.stuNo), 33 new { stuNo = 1, name = "", age = 1, gradName = "" }, pageIndex, pageSize).Value; 34 35 WebApplication1.DataEntity result = new WebApplication1.DataEntity(); 36 result.total = data.Count(); 37 result.rows = dt; 38 return result; 39 }

 

關於數據部分 和EF linq 分頁那些我就不貼出來了 完整示例下載里面有。走走看吧 試試看吧 完全無刷新 服務端分頁,感覺棒棒噠

搜索那個我也不想說了哈 就是重新載入下數據而已,刪除是通過自定義 列的方式 傳id到js函數 然后調用服務端刪除。然后要說下 錄入功能 以及easyui自帶 的表單驗證也是相當方便的。

新建一個div 作為彈出層 里面有一個錄入信息的表格 各種html控件 只要寫上easyui對應的樣式  就自動渲染了 看彈出層的  class="easyui-dialog" data-options="closed:true,title:'新學生注冊',modal:true"

其實很簡單噻看字面意思就明白了 這些參數 都在easyui的文檔里有。驗證 也是在html元素上寫data-options 就可以了, :

 1 <div id="addBox" class="easyui-dialog" data-options="closed:true,title:'新學生注冊',modal:true" style="width: 400px; height: 150px">
 2 
 3             <table class="auto-style1">
 4                 <tr>
 5                     <td>學生姓名:</td>
 6                     <td>
 7                         <input id="stuname" class=" easyui-textbox" data-options="required:true,missingMessage:'必填項!',validType:'email',invalidMessage:'email格式不正確!'" type="text" /></td>
 8                 </tr>
 9                 <tr>
10                     <td>班級: </td>
11                     <td>
12                         <input class="easyui-combobox" id="grad" name="grad"
13                             data-options="valueField:'id',textField:'gradName',required:true,missingMessage:'必填項!'" /></td>
14                 </tr>
15                 <tr>
16                     <td>
17                         <input id="saveBtn" onclick="saveClick()" type="button" value="保存" /></td>
18                     <td>
19                         <input id="Button1" type="button" onclick="$('#addBox').dialog('close');" value="關閉" /></td>
20                 </tr>
21             </table>
22         </div>


新建按鈕:

1 <a id="Button1" onclick="$('#addBox').dialog('open');" class="easyui-linkbutton">加新的</a>

注意千萬別用button 元素  就是這種 <button>新加的</button>  這是個坑 ,折騰了好久。

保存按鈕調用 的js函數:

 1 //保存信息
 2         function saveClick() {
 3             var isvaliok = $("#addBox").form('validate');//包起來的需要提交信息的那個div框的id
 4             if (isvaliok == false) {
 5                 $.messager.show({ title: '提示', msg: '請完善不正確的項后再提交', showType: 'show' });
 6                 return;
 7             }
 8             var stu = {};
 9             stu.name = $("#stuname").val();
10             stu.age = 22;
11             stu.GradId = $("#grad").combobox('getValue');
12             stu.gradName = $("#grad").combobox('getValue');
13             if (isNaN(stu.GradId))
14                 stu.GradId = null;
15             var rst = WebApplication1.NewFolder2.HelloAjaxNet.addStu(stu);
16 
17             if (rst.value == "ok") {
18                 $('#addBox').dialog('close');
19                 $('#studb').datagrid('reload');
20 
21                 var gradData = WebApplication1.NewFolder2.HelloAjaxNet.getGrad().value;
22                 $('#grad').combobox({ data: gradData }).combobox('reload');
23             }
24             else {
25                 $.messager.show({ title: '提示', msg: rst.error.Message + rst.value, showType: 'show' });
26             }
27 
28         }

注意到了噻:

1 var isvaliok = $("#addBox").form('validate');//包起來的需要提交信息的那個div框的id
2             if (isvaliok == false) {
3                 $.messager.show({ title: '提示', msg: '請完善不正確的項后再提交', showType: 'show' });
4                 return;
5             }

在easyui里進行驗證很簡單噻 只要在html代碼里把驗證格式定義好了 ,只需要傳入一個最外面容器控件的id $("#addBox").form('validate') 就自動幫我們驗證了。並且界面上還有提示 焦點自動放到第一個驗證不通過的控件上去了 完全不需要我們動手。


當然我們在客戶端 document.ready()的時候 必須要綁定表格和下拉框的數據:

1 $(function () {
2             //頁面初始化
3             //載入表格數據
4             bindDataToTb();
5             //載入班級下拉框
6             var gradData = WebApplication1.NewFolder2.HelloAjaxNet.getGrad().value;
7             $('#grad').combobox({ data: gradData }).combobox('reload');
8             var fd = new FormData();
9         });

 

服務端保存的代碼:

 1 //添加
 2         [AjaxPro.AjaxMethod]
 3         public string addStu(StudentsInfo stu)
 4         {
 5             MyDb db = new MyDb();
 6             if(stu.GradId==null)
 7             {
 8                 if (string.IsNullOrEmpty(stu.gradName) == false)
 9                 {
10                     Grad grd = new Grad();
11                     grd.gradName = stu.gradName;
12 
13                     Grad grdOld = db.grads.FirstOrDefault(r => r.gradName == stu.gradName);
14                     if(grdOld!=null)
15                     {
16                         return "類別已存在";
17                     }
18                     else
19                     {
20                         db.grads.Add(grd);
21                         stu.grad = grd;
22                     }
23                 }
24             }
25             db.Students.Add(stu);
26             db.SaveChanges();
27             return "ok";
28         }


服務端代碼  如果我們沒有這個id的類別我們就認為這個類別是新的 ,新加一個類別 然后立即綁定 perfect 完美 ,棒棒噠

 

看上去是不是有模有樣。做管理類軟件還行。

這樣ui 那樣ui當你需要自定義樣式的時候發現什么ui都是浮雲,例如我說的國內的寫js比較牛的 就已經造出來很多ui了 ,表格是很漂亮 很強大。 其實很多功能你還是用不到 你想改還很困難 當然我的js也是很菜的。 當你用到另一套ui 的時候又要熟悉它那一套 。我只想用個簡簡單單的自定義分頁表格而已 或者像asp.net里的服務器控件repeat 流式布局 四個數據一行那種 你怎么做。 還是自己動手吧。php里面有前端模板。

我這里只是簡單從實際需求了解下angular的威力 php里面模板什么的都是浮雲   新建一個webform  HelloAjaxNetAngular.aspx

注意這個例子  服務端代碼我一律用上面的絲毫都不會變 只是前端變了,angularjs 的主打思想是mvvm 模式 就是wpf里面那種依賴屬性 動態綁定 ,不知道你們用過沒 反正我用過 感覺就一個字 爽 ,做這種數據庫平台程序 mfc winform 都是渣。

angularjs 的基礎我就不介紹了 哈 直接從需求入手 做一個分頁表格 加 信息更新 功能

angularjs的網站是 http://www.angularjs.org/ 這個網址在國內也是訪問不了的。一些相關的其他人的學習筆記有 http://www.angularjs.cn/ http://www.zouyesheng.com/angular.html

反正這兩個教程看了下對我沒 對我沒起到啥作用 感覺跟嚼木渣樣的 ,angularjs的理念雖然是mvvm 但是angularjs本身還是感覺晦澀難懂。

我就在這樣一個半懂不懂的狀態下寫了這個例子 ,所有的操作 幾乎都完全不需要向jquery那樣動dom 。真心感覺到了他的強大。前端就一個controller函數 管整個頁面,怎么一個一個的分 我也不明白 只知道controller 跟html限定一樣的樹狀結構。沒在范圍的html元素不能訪問其controller里的 變量。
我們來看這個controller 函數 ,我寫的時候也沒什么感覺 。就是感覺很存粹 就只感覺到兩個東西存在 。業務邏輯在操作數據。 就像在寫c#數據操作代碼樣:

 1 function myCtr($scope) {
 2             var mod = [{ name: 'xiang', age: 21 }, { name: 'xiang', age: 25 }, { name: 'xiang', age: 23 }];
 3             $scope.data = mod;
 4             $scope.curobj = {};
 5             $scope.pageEntity = { total: 0, rows: 5, page: 1, pgmsg: '' }
 6 
 7             //初始化默認第一頁
 8             $scope.initPage = function () {
 9                 var firstPage = WebApplication1.NewFolder2.HelloAjaxNetAngular1.BindData($("#txtkeyword").val(), $scope.pageEntity.page, $scope.pageEntity.rows);
10                 $scope.data = firstPage.value.rows;
11 
12                 var pageEntityMod = {};
13                 pageEntityMod.total = firstPage.value.total;
14                 pageEntityMod.rows = $scope.pageEntity.rows;
15                 pageEntityMod.page = $scope.pageEntity.page;
16                 var totalpage = pageEntityMod.total % pageEntityMod.rows == 0 ?
17                     parseInt(pageEntityMod.total / pageEntityMod.rows) :
18                     parseInt(pageEntityMod.total / pageEntityMod.rows) + 1;
19                 pageEntityMod.pgmsg = "共 " + pageEntityMod.total + "條記錄 每頁 " + pageEntityMod.rows
20                     + "條,共 " + totalpage + "頁 ,當前第 " + pageEntityMod.page + "頁";
21                 $scope.pageEntity = pageEntityMod;
22 
23                 $scope.curobj = {};
24             }
25 
26             //更新當前 選定的
27             $scope.modifyCur = function () {
28                 var rst = WebApplication1.NewFolder2.HelloAjaxNetAngular1.updateStu($scope.curobj)
29                 //刷新表格 當前選中信息 復原
30                 $scope.initPage();
31                 alert(rst.value);
32             }
33 
34             //下翻頁
35             $scope.nextPage = function () {
36                 var totalpage = $scope.pageEntity.total % $scope.pageEntity.rows == 0 ?
37                     parseInt($scope.pageEntity.total / $scope.pageEntity.rows) :
38                     parseInt($scope.pageEntity.total / $scope.pageEntity.rows) + 1;
39                 var pagenewnum = $scope.pageEntity.page + 1;
40                 if (pagenewnum <= totalpage)
41                     $scope.pageEntity.page += 1;
42                 $scope.initPage();
43             }
44             //上翻頁
45             $scope.previousPage = function () {
46                 var pagenewnum = $scope.pageEntity.page - 1;
47                 if (pagenewnum >= 1)
48                     $scope.pageEntity.page -= 1;
49                 $scope.initPage();
50             }
51             //搜索
52             $scope.search = function () {
53             }
54             //選中一行
55             $scope.del = function (sender, curobj) {
56                 //所有行的顏色還原//設置選中那一行的顏色
57                 var rows = $(sender.target).parent().parent().parent().find("tbody").find("tr");
58                 for (var i = 0; i < rows.length; i++) {
59                     $(rows[i]).css("background", "white");
60                 }
61                 $(sender.target).parent().css("background", "#ffe48d");
62                 $scope.curobj = curobj;
63             }
64 
65             //首次先調用下 以獲取第一頁
66             $scope.initPage();
67         }

界面部分:

 1 <div ng-controller="myCtr" id="mygrid">
 2                 <input id="txtkeyword" type="text" /><input ng-click="initPage()" type="button" value="搜索" />
 3                 <br />
 4                 <br />
 5                 <div style="height: 200px">
 6                     <table cellspacing="0" border="1" class="gridtable">
 7                         <thead>
 8                             <th width="150px">name</th>
 9                             <th width="150px">age</th>
10                         </thead>
11                         <tbody ng-repeat="stu in data">
12                             <tr ng-click='del($event,stu)' style="background-color: white">
13                                 <td>{{stu.name}}</td>
14                                 <td>{{stu.age}}</td>
15                             </tr>
16                         </tbody>
17                     </table>
18 
19                 </div>
20                 <div id="pager">
21                     <a href="#" ng-click="previousPage()">上一頁</a> <a href="#" ng-click="nextPage()">下一頁</a>
22                     <span>{{pageEntity.pgmsg}}</span>
23                 </div>
24 
25                 <div>
26                     姓名:<input type="text" value="{{curobj.name}}" ng-model="curobj.name" /><br />
27                     年齡:<input type="text" value="{{curobj.age}}" ng-model="curobj.age" />
28                     <input id="Button1" type="button" ng-click="modifyCur()" value="更改" />
29                 </div>
30             </div>

 

看到我自己搞了一個數據綁定函數 參照easyui里datagrid的loader。  第一次請求得到分頁信息后 我立即把數據綁定到表格 你可以看到完全就像做模板樣的,然后初始化自己的分頁控件。 在ng-click 的時候像原來一樣觸發客戶端單擊 然后調用controller里的方法去更新數據 ,注意僅僅是根據業務邏輯去更新數據 其他的不需要做。關於上面兩段代碼不明白的自行去看angularjs 入門和數據綁定 用不了10分鍾,

由於有wpf那種雙向綁定機制,數據模型 數據更新了 頁面內容自動跟着變。甚至你可以看到我編輯下面文本框里的數據的時候 都還沒提交 上面表格的數據就跟着變 因為他們的數據是從同一個地方來的,看着恍惚都感覺是ajax哈。

上面所有示例的項目源碼下載 可直接運行,由於引了些外部庫進來十兆差點放不下

說點后話

其實照互聯網這樣推動發展下去的話 前端會統一 前端才是王道 到時候一個網頁 就是一個系統 一個客戶端。 后端只負責數據和安全。 現在的什么html5不是幾乎都成為工業標准了么 有些嵌入式設備都支持

暫時像博客園里我看到的有幾個講的 前后端天人合一的那種mvc模式 前端后端操作同一個model 前端更新屬性了有一種機制自動就更新到后端持久化到數據庫去了  或者后端更新model的某個屬性 前端html頁面的值自動就變了。 不是說做不到 畢竟牛人這么多 ,我覺得至少還不穩定吧。

各種ui有easyui ligerui fineui miniui  Devexpress 還有很多js框架 seajs requirejs JavaScriptMVC  backbone avalonjs knockout angular jquery jqueryui js真是屎一樣的東西啊各種框架學都學不完

尤其是軟件行業日新月異 基於框架 和平台的技術太多了 不精通某樣技術沒關系 能使用就行 ,但是作為一個技術人員 你至少得精通一樣 或者一門技術 要不然就是個搬磚的 很遺憾 我基本還在搬磚的路上。寫業務代碼就是用一年的經驗混十年,寫業務代碼是他的工作 工作之余還得有點精神追究 研究下事情的本質 ,只要是還不錯的程序員 做這種數據庫系統久了都會自己搞點能快速開發的所謂的小框架 積累一些自己的工具庫 和經驗。

在工作上不要有什么偏見  只要他每天把業務代碼寫的出來 軟件開發也只是一門職業 你不是英雄 ,目的是解決問題 不是轉牛角尖。

 

我本人對js是不怎么感冒的 js也很爛,當初設計這個東西的時候就不完善給我們使用它造成了各種阻礙 ,但是你做web開發又不得不用它。這里也並不是對做前端的有什么偏見 感謝那些前端吃的很透的人 像司徒正美那些高手 制造了這些工具讓我們更容易的去完成這些網站程序。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM