angularjs和ajax的結合使用 (三)

来源:https://www.cnblogs.com/assassinx/archive/2018/09/19/9657758.html
-Advertisement-
Play Games

轉眼九月份了,忙忙碌碌 發現今年還沒開過張,寫一篇吧。 15年在空閑時就倒騰過angularjs那玩意兒 ,覺得還是挺好的,李金龍那厚厚的一本書,只不過沒有系統化應用。最主要的是原來有一個東西沒有用到 那就是路由。在中衡的時候看到黃國文同志用那種全ajax的方式做的網站,那感覺。。。現在公司竟然也這 ...


轉眼九月份了,忙忙碌碌 發現今年還沒開過張,寫一篇吧。

15年在空閑時就倒騰過angularjs那玩意兒 ,覺得還是挺好的,李金龍那厚厚的一本書,只不過沒有系統化應用。最主要的是原來有一個東西沒有用到 那就是路由。在中衡的時候看到黃國文同志用那種全ajax的方式做的網站,那感覺。。。現在公司竟然也這麼做,全是JS 寫成一大坨跟屎一樣的 js這玩意兒是弱類型的 調也不好調 對它完全沒好感 看到那些js代碼都快吐了,ajax有那麼好麽 ,整個頁面你不還是得刷新 ,快得了多少 頁面還不容易控制。現在看了李師傅搞的 黃國文同志那也就那麼回事兒而已。相對來說用angularJS更好 ,總之現在很討厭JS。好吧整都整了也不抱怨了 ,我們還是一起來學習下他吧。這段時間做的工作是易電小跟班 年初在小跟班分支上做了易電設備移動端。 用的比較多的是 angularjs1.x ,今天將分享他的使用 和一些技巧。 

基本使用:

angularJS的官方網站是 https://angularjs.org/  VisualStudio 都把angularjs指令的智能提示都集成進來了,足以證明還是有一定認可度的。angularJS的基本使用前兩章已經講過了 沒有太多說的,但是我們還是來複習下:

引入angularjs 和ui-router.js

1 <script src="../WebTools/angular.min.js"></script>
2 <script src="../WebTools/angular-ui-router.min.js"></script>

然後界面上定義app和視圖作用域 ,也就是 ng-app="" 和 ng-controller

 1 <html xmlns="http://www.w3.org/1999/xhtml" ng-app="xiangapp">
 2 <head>
 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 4     <title></title>
 5     <script src="\WebTools\jquery-2.0.2.min.js"></script>
 6     <script src="\WebTools\angular.min.js"></script>
 7     <script src="\WebTools\angular-route.js"></script>
 8 </head>
 9 <body>
10     <div ng-controller="maincontroller">
11     </div>
12 
13 </body>
14 </html>

Angularjs是一個mvvm框架 ,核心理念是 讓界面上產生一個個領域 讓這些領域跟js後臺聯繫起來。讓界面的app作用域 controller作用域這些 跟 後臺的數據產生關聯 ,但同時 這些作用域又是 可以嵌套的  controller可以嵌套的,上層作用域的東西 可以被下層調用  以達到靈活運用的目的。也不知道我到底講清楚沒 - -!感覺自己講這些有點語無倫次的。

然後就是把前面指定的界面部分綁定到作用域 並註入ui-router ,它的意義是把界面作用域的部分 跟js綁定 並給js一個“”把柄“” 以便控制數據 ,告訴js這部分界面的數據歸你這個scope管。說了這麼多還是紅色部分字的意思。雖然代碼還是差不多的代碼,但是自己時切切實實的感覺 應用比15年時候的那種照貓畫虎更實在些了,理解也更深刻些了。非要怎麼說嘛 意會。


把界面指定部分綁定到js作用域 並註入ui-router 然後定義路由規則:

 1 var app = angular.module("xiangapp", ["ui.router"]);
 2 
 3 app.config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {
 4     $urlRouterProvider.otherwise('/main');
 5 
 6     $stateProvider
 7         .state('home', {
 8             url: '/home',
 9             views: {
10                 "body": {
11                     templateUrl: 'home.html',
12                     controller: 'homecontroller'
13                 }
14             }
15         })
16         .state('about', {
17             url: '/about',
18             views: {
19                 "body3": {
20                     templateUrl: 'about.html',
21                     controller: 'aboutcontroller'
22                 }
23             }
24         })

註入確實是angularjs的一個特色,註意上面已經拿到一個app的把柄了,只要拿到這個app的把柄我們就可以為所欲為了,比如上面的配置路由,做一些前置配置操作。總之註入這個工具類後 我們就可以在controller里使用它了,這個後面再說,總之是各種註入 ,你可以理解為angular里一種比較方便的套路,註入一個工具服務類:

1 var app = angular.module("xiangapp", ["ui.router"]);
2 //註入一個util 工具類
3 app.service("Util", function ($http, $rootScope) {
4     this.showMsg = function (msg) {
5         alert(msg);
6     };
7 });

最後的最後其實就是一些搬磚工作 就是編寫路由到的各個子模塊定義的controller ,在裡面編寫各個頁面自管區域的邏輯。註意 註意 註意 重要的事情說三遍 ,依然是通過上面app這個重要的把柄 來編寫各個controller邏輯,比如這裡我們編寫mainController 其他的也類似:

1 app.controller("maincontroller", function ($scope, Util) {
2     $scope.message = "主controller初始化信息";
3     Util.showMsg("UtilService調用");
4 });

我們也可以把一些公共的東西放到 $rootscope裡面去。AngularJS的作用域可以是一個嵌套結構,controller嵌controller,下層作用域即使沒有寫對應的函數,也可以調用上層的函數。

其實angularjs 自帶了 ngroute 路由(也要另外再引入js) 為甚我們還要再使用ui-router,Ui-router路由方式 比angular自帶的路由方式好的地方:
通過$state和$stateparameter 達到靈活的狀態跳轉
支持嵌套視圖(基本用不上)
ui-router它最大的作用是將web界面的設計分塊了

冒泡事件和廣播事件

angularJS里還有個很有用的東西就是事件觸發,各個controller可以嵌套 也可以相互獨立 他們之間可以通過事件觸發的機制來進行消息傳遞和觸發某個動作,可能會說不是controller可以嵌套 子controller可以直接調用主controller的函數麽 ,是的 但是只能直接的方式調一次你上層controller的函數,並且形不成事件 響應 這種的結構 會導致結構混亂,所以  ,該用啥就用啥。響應冒泡事件 和響應廣播事件 代碼是一樣的:

1 $scope.$on("toparentEvent", function (event, args) {
2     alert(args.message + "ggg");
3 });

廣播事件是主controller往子controller傳遞依次觸發所有響應了此事件的代碼,冒泡事件是從子controller往上層傳遞依次觸發響應了此事件的代碼。 觸發廣播事件 和觸發冒泡事件的代碼有所不同,發動冒泡事件:

1 //往父級傳遞事件
2 $scope.toparentEvent = function () {
3     $scope.$emit("toparentEvent", { message: "我是子Controller的消息" });
4 }

發動廣播事件:

1 //廣播
2 $scope.boardCastEvent = function () {
3     $scope.$broadcast("boardCastEvent", { message: "我是廣播消息" });
4 }

promise調用:

angularJS里的另一個大殺器,那就是promise ,這到底是個神馬玩意兒,在網上說怎麼怎麼ajax回調嵌套 陷入回調地獄,巴拉巴拉 就是沒給個ajax promise回調的例子出來 ,首先promise的詳細說明這裡有一篇教程:https://www.cnblogs.com/ZengYunChun/p/6438330.html
使用的基本思想是 首先引入$q 使用defer() 獲取promise對象 ,在非同步調用正常結束的地方 也就是ajax回調成功的地方resolved() , 在函數結束的地方return  xx.promise 即可 ,這個套路有點像多線程同步的調調。下麵是我的一個ajax鏈式調用例子:

 1 var defer1 = $q.defer();
 2 $http.get("/api/Class1/GetTest").success(function (res) {
 3     setTimeout(function () {
 4         alert("aa");
 5         defer1.resolve();
 6     }, 3000);
 7 });
 8 
 9 var promise1 = defer1.promise;
10 
11 var defer2 = $q.defer();
12 promise1.then(function (res) {
13     $http.get("/api/Class1/GetTest").success(function (res) {
14         setTimeout(function () {
15             alert("bb");
16             defer2.resolve();
17         }, 2000);
18     });
19 });
20 
21 var promise2 = defer2.promise;
22 
23 promise2.then(function (res) {
24     alert("cc");
25 });

看就是這種方式 通過defer.promise 得到一個同步句柄 ,然後此promise.then裡面再處理同步,可一直寫到promiseN ,看果然沒有形成嵌套 。 但是他大爺的 感覺怪怪的。
每次得到一個promise用於在下一個then里進行同步。能說的就這麼多了。又得到一個promise進行下一次同步 如此往複。
當然如果你玩兒熟了,還可以玩兒子路由,其它各種更靈活 的應用,反正最基本的就是這些了,其它全靠你的創造。總之angularJS就是通過這些手段 進行靈活 併合理的歸併  進行業務邏輯 和數據處理。

一些心得:

並不是界面最外面一層一定要有菜單 跳轉,可以是一個空白。
路由機制 history.back()。從上至下進行分支跳轉 ,history.back() 則相當於在跳轉的樹里回到了上一級 。(對於手機端app的跳轉需求)這是一個比較完美的路由機制 。
並不一定要是從頭至尾ajax的 ,頁面是可以刷新的 ,你一個state url 就是一個模塊 ,要合理的使用模塊間參數。

日期格式 跟後臺的 交互,說到底不論get post 提交到後臺的始終是字元串。
JavaScript使用Date.toJSON()就可以了 後臺接收json數據 可以天然的接收 2018-05-20 18:30 這種的日期格式。
直接後臺收到的C#數據就是datetime , 轉換都不需要, get post一樣 。 但是JavaScript直接傳 new date() 到後臺則無法預知會轉換成什麼樣格式的字元串到後臺 導致c#解析DateTime類型出現錯誤。

一個頁面 並不一定只能寫那一個固定名字的controller。

還有我當爸爸了。。。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 創建laravel應用 laravel new app_name 使用 PHP 內置 web server 驅動我們的網站 cd xxx/public php -S localhost:port 查看所有可用的 Artisan 命令 php artisan list 激活某些功能 eg:auth系統 ...
  • 題意 題目鏈接 給出一個字元串,每次操作可以使得字元串縮短一位,且第$i$位必須要保證與變換前的這一位或下一位相同, 問使得整個字元串全相同最少的操作次數 Sol 300P的題我都要想10min啊,還是太菜了。。 首先我們可以枚舉一個字母,強行讓他成為最後的答案 對於末尾與它不同的數只能一個個刪掉, ...
  • import requests from requests.exceptions import RequestException import re import json from multiprocessing import Pool def get_one_page(url): headers... ...
  • 異常處理,是編程語言或電腦硬體里的一種機制,用於處理軟體或信息系統中出現的異常狀況(即超出程式正常執行流程的某些特殊條件)。 1.異常的類型 異常的類型多種多樣,常見的異常有: 其他的異常: Exception可以捕獲任意異常 2.捕獲異常,處理異常 只有將對應的異常類型捕獲才能進行異常的處理 異 ...
  • 文件名全小寫,可使用下劃線 包應該是簡短的、小寫的名字。如果下劃線可以改善可讀性可以加入。如mypackage。 模塊與包的規範同。如mymodule。 類總是使用首字母大寫單詞串。如MyClass。內部類可以使用額外的前導下劃線。 函數&方法函數名應該為小寫,可以用下劃線風格單詞以增加可讀性。如: ...
  • 深淺拷貝 淺拷貝 a=[[1,2],3,4] b=a[:] #b=a.copy() 淺拷貝 作用 輸出 ['Xiaomei', 345, [15000, 6000]] 淺拷貝copy.copy() 深拷貝copy.deepcopy() 輸出 ['Xiaomei', 345, [15000, 6000 ...
  • 條件語句的執行過程: if 條件判斷註意:1.每個條件後面要使用冒號 : ,表示條件為True時要執行的代碼;2.使用縮進來劃分代碼塊,相同縮進數的語句在一起組成一個代碼塊。 if...else,單條件判斷 if...elif...else,多條件判斷 ...
  • using SqlSugar; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Web; namespace Web.Code.DA... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...