<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    #

    angular-smarty

    angular-smarty 是一個基于 AngularJS 實現的自動完成的 UI 實現。

    使用方法:
    <html>
    <head>
        <title>angular-smarty demo</title>
        <link rel="stylesheet" type="text/css" href="smarty.css"></link>
    </head>
    <body ng-controller="SmartyController">
        <div class="container-main">
            <h1>angular-smarty demo</h1>
            <div class="container-autocomplete">
                <input type="text" smarty-input select="setSelected(x)"
                    index
    ="selected" list-items="suggestions" close="suggestionPicked()"
                    selection-made
    ="selectionMade" ng-model="prefix"></input>
                <div smarty-suggestions-box></div>
                <input type="text" focus-me focus-when="{{selectionMade}}"></input>
            </div>
        </div>
    </body>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.14/angular.js"></script>
    <script type="text/javascript" src="smarty-config.js"></script>
    <script type="text/javascript" src="smarty.js"></script>
    <script type="text/javascript">
        $(
    function() {
            angular.bootstrap(angular.element(
    "body"), ["angular-smarty"]);
        });
    </script>
    </html>

    https://github.com/thumbtack/angular-smarty

    posted @ 2014-06-19 09:01 paulwong 閱讀(573) | 評論 (0)編輯 收藏

    JVM實用參數-6 吞吐量收集器

    在實踐中我們發現對于大多數的應用領域,評估一個垃圾收集(GC)算法如何根據如下兩個標準:  
    1. 吞吐量越高算法越好
    2. 暫停時間越短算法越好
    首先讓我們來明確垃圾收集(GC)中的兩個術語:吞吐量(throughput)和暫停時間(pause times)。 JVM在專門的線程(GC threads)中執行GC。 只要GC線程是活動的,它們將與應用程序線程(application threads)爭用當前可用CPU的時鐘周期。 簡單點來說,吞吐量是指應用程序線程用時占程序總用時的比例。 例如,吞吐量99/100意味著100秒的程序執行時間應用程序線程運行了99秒, 而在這一時間段內GC線程只運行了1秒。

    術語”暫停時間”是指一個時間段內應用程序線程讓與GC線程執行而完全暫停。 例如,GC期間100毫秒的暫停時間意味著在這100毫秒期間內沒有應用程序線程是活動的。 如果說一個正在運行的應用程序有100毫秒的“平均暫停時間”,那么就是說該應用程序所有的暫停時間平均長度為100毫秒。 同樣,100毫秒的“最大暫停時間”是指該應用程序所有的暫停時間最大不超過100毫秒。


    吞吐量 VS 暫停時間

    高吞吐量最好因為這會讓應用程序的最終用戶感覺只有應用程序線程在做“生產性”工作。 直覺上,吞吐量越高程序運行越快。 低暫停時間最好因為從最終用戶的角度來看不管是GC還是其他原因導致一個應用被掛起始終是不好的。 這取決于應用程序的類型,有時候甚至短暫的200毫秒暫停都可能打斷終端用戶體驗。

    因此,具有低的最大暫停時間是非常重要的,特別是對于一個交互式應用程序。 不幸的是”高吞吐量”和”低暫停時間”是一對相互競爭的目標(矛盾)。這樣想想看,為了清晰起見簡化一下:GC需要一定的前提條件以便安全地運行。 例如,必須保證應用程序線程在GC線程試圖確定哪些對象仍然被引用和哪些沒有被引用的時候不修改對象的狀態。

    為此,應用程序在GC期間必須停止(或者僅在GC的特定階段,這取決于所使用的算法)。 然而這會增加額外的線程調度開銷:直接開銷是上下文切換,間接開銷是因為緩存的影響。 加上JVM內部安全措施的開銷,這意味著GC及隨之而來的不可忽略的開銷,將增加GC線程執行實際工作的時間。

    因此我們可以通過盡可能少運行GC來最大化吞吐量,例如,只有在不可避免的時候進行GC,來節省所有與它相關的開銷。 然而,僅僅偶爾運行GC意味著每當GC運行時將有許多工作要做,因為在此期間積累在堆中的對象數量很高。 單個GC需要花更多時間來完成, 從而導致更高的平均和最大暫停時間。 因此,考慮到低暫停時間,最好頻繁地運行GC以便更快速地完成。 這反過來又增加了開銷并導致吞吐量下降,我們又回到了起點。

    綜上所述,在設計(或使用)GC算法時​​,我們必須確定我們的目標:一個GC算法​​只可能針對兩個目標之一(即只專注于最大吞吐量或最小暫停時間),或嘗試找到一個二者的折衷。


    HotSpot虛擬機上的垃圾收集

    該系列的第五部分我們已經討論過年輕代的垃圾收集器。 對于年老代,HotSpot虛擬機提供兩類垃圾收集算法(除了新的G1垃圾收集算法),第一類算法試圖最大限度地提高吞吐量,而第二類算法試圖最小化暫停時間。 今天我們的重點是第一類,”面向吞吐量”的垃圾收集算法。

    我們希望把重點放在JVM配置參數上,所以我只會簡要概述HotSpot提供的面向吞吐量(throughput-oriented)垃圾收集算法。 當年老代中由于缺乏空間導致對象分配失敗時會觸發垃圾收集器(事實上,”分配”的通常是指從年輕代提升到年老代的對象)。

    從所謂的”GC根”(GC roots)開始,搜索堆中的可達對象并將其標記為活著的,之后,垃圾收集器將活著的對象移到年老代的一塊無碎片(non-fragmented)內存塊中,并標記剩余的內存空間是空閑的。 也就是說,我們不像復制策略那樣移到一個不同的堆區域,像年輕代垃圾收集算法所做的那樣。

    相反地,我們把所有的對象放在一個堆區域中,從而對該堆區域進行碎片整理。 垃圾收集器使用一個或多個線程來執行垃圾收集。 當使用多個線程時,算法的不同步驟被分解,使得每個收集線程大多時候工作在自己的區域而不干擾其他線程。 在垃圾收集期間,所有的應用程序線程暫停,只有垃圾收集完成之后才會重新開始。

    現在讓我們來看看跟面向吞吐量垃圾收集算法有關的重要JVM配置參數。


    -XX:+UseSerialGC

    我們使用該標志來激活串行垃圾收集器,例如單線程面向吞吐量垃圾收集器。 無論年輕代還是年老代都將只有一個線程執行垃圾收集。 該標志被推薦用于只有單個可用處理器核心的JVM。 在這種情況下,使用多個垃圾收集線程甚至會適得其反,因為這些線程將爭用CPU資源,造成同步開銷,卻從未真正并行運行。


    -XX:+UseParallelGC

    有了這個標志,我們告訴JVM使用多線程并行執行年輕代垃圾收集。 在我看來,Java 6中不應該使用該標志因為-XX:+UseParallelOldGC顯然更合適。 需要注意的是Java 7中該情況改變了一點(詳見本概述),就是-XX:+UseParallelGC能達到-XX:+UseParallelOldGC一樣的效果。


    -XX:+UseParallelOldGC

    該標志的命名有點不巧,因為”老”聽起來像”過時”。 然而,”老”實際上是指年老代,這也解釋了為什么-XX:+UseParallelOldGC要優于-XX:+UseParallelGC:除了激活年輕代并行垃圾收集,也激活了年老代并行垃圾收集。 當期望高吞吐量,并且JVM有兩個或更多可用處理器核心時,我建議使用該標志。
    作為旁注,HotSpot的并行面向吞吐量垃圾收集算法通常稱為”吞吐量收集器”,因為它們旨在通過并行執行來提高吞吐量。


    -XX:ParallelGCThreads

    通過-XX:ParallelGCThreads=<value>我們可以指定并行垃圾收集的線程數量。 例如,-XX:ParallelGCThreads=6表示每次并行垃圾收集將有6個線程執行。 如果不明確設置該標志,虛擬機將使用基于可用(虛擬)處理器數量計算的默認值。 決定因素是由Java Runtime。availableProcessors()方法的返回值N,如果N<=8,并行垃圾收集器將使用N個垃圾收集線程,如果N>8個可用處理器,垃圾收集線程數量應為3+5N/8。

    當JVM獨占地使用系統和處理器時使用默認設置更有意義。 但是,如果有多個JVM(或其他耗CPU的系統)在同一臺機器上運行,我們應該使用-XX:ParallelGCThreads來減少垃圾收集線程數到一個適當的值。 例如,如果4個以服務器方式運行的JVM同時跑在在一個具有16核處理器的機器上,設置-XX:ParallelGCThreads=4是明智的,它能使不同JVM的垃圾收集器不會相互干擾。


    -XX:-UseAdaptiveSizePolicy

    吞吐量垃圾收集器提供了一個有趣的(但常見,至少在現代JVM上)機制以提高垃圾收集配置的用戶友好性。 這種機制被看做是HotSpot在Java 5中引入的”人體工程學”概念的一部分。 通過人體工程學,垃圾收集器能將堆大小動態變動像GC設置一樣應用到不同的堆區域,只要有證據表明這些變動將能提高GC性能。 “提高GC性能”的確切含義可以由用戶通過-XX:GCTimeRatio和-XX:MaxGCPauseMillis(見下文)標記來指定。

    重要的是要知道人體工程學是默認激活的。 這很好,因為自適應行為是JVM最大優勢之一。 不過,有時我們需要非常清楚對于特定應用什么樣的設置是最合適的,在這些情況下,我們可能不希望JVM混亂我們的設置。 每當我們發現處于這種情況時,我們可以考慮通過-XX:-UseAdaptiveSizePolicy停用一些人體工程學。


    -XX:GCTimeRatio

    通過-XX:GCTimeRatio=<value>我們告訴JVM吞吐量要達到的目標值。 更準確地說,-XX:GCTimeRatio=N指定目標應用程序線程的執行時間(與總的程序執行時間)達到N/(N+1)的目標比值。 例如,通過-XX:GCTimeRatio=9我們要求應用程序線程在整個執行時間中至少9/10是活動的(因此,GC線程占用其余1/10)。 基于運行時的測量,JVM將會嘗試修改堆和GC設置以期達到目標吞吐量。 -XX:GCTimeRatio的默認值是99,也就是說,應用程序線程應該運行至少99%的總執行時間。


    -XX:MaxGCPauseMillis

    通過-XX:GCTimeRatio=<value>告訴JVM最大暫停時間的目標值(以毫秒為單位)。 在運行時,吞吐量收集器計算在暫停期間觀察到的統計數據(加權平均和標準偏差)。 如果統計表明正在經歷的暫停其時間存在超過目標值的風險時,JVM會修改堆和GC設置以降低它們。 需要注意的是,年輕代和年老代垃圾收集的統計數據是分開計算的,還要注意,默認情況下,最大暫停時間沒有被設置。

    如果最大暫停時間和最小吞吐量同時設置了目標值,實現最大暫停時間目標具有更高的優先級。 當然,無法保證JVM將一定能達到任一目標,即使它會努力去做。 最后,一切都取決于手頭應用程序的行為。

    當設置最大暫停時間目標時,我們應注意不要選擇太小的值。 正如我們現在所知道的,為了保持低暫停時間,JVM需要增加GC次數,那樣可能會嚴重影響可達到的吞吐量。 這就是為什么對于要求低暫停時間作為主要目標的應用程序(大多數是Web應用程序),我會建議不要使用吞吐量收集器,而是選擇CMS收集器。 CMS收集器是本系列下一部分的主題。

    posted @ 2014-06-16 17:26 paulwong 閱讀(6690) | 評論 (0)編輯 收藏

    mongodb最大連接數修改

    在Linux平臺下,無論是64位或者32位的MongoDB默認最大連接數都是819,WIN平臺不知道,估計也沒有人在 WIN平臺下使用MongoDB做生產環境

    [root@DELL113 mongodb-linux-i686-2.4.1]# ./bin/mongo 192.168.6.42
    MongoDB shell version: 2.4.1
    connecting to: 192.168.6.42/test
    > db.serverStatus().connections
    { "current" : 1, "available" : 818, "totalCreated" : NumberLong(1) }
    途中available顯示818少了一個,表示空閑的。current表示已經占用了的連接數,兩數一加就等于819,如果我現在在連接一個,那么available就是817,current就是2

    [root@DELL113 mongodb-linux-i686-2.4.1]# ./bin/mongo 192.168.6.42
    MongoDB shell version: 2.4.1
    connecting to: 192.168.6.42/test
    > db.serverStatus().connections
    { "current" : 1, "available" : 818, "totalCreated" : NumberLong(1) }
    > db.serverStatus().connections
    { "current" : 2, "available" : 817, "totalCreated" : NumberLong(2) }
    819個連接數對于一般的站點我認為已經夠用,并且都是現連現取現斷。但這個連接數也可以修改,只要在啟動的時候加入--maxConns即可

    服務器啟動

    [root@lee mongodb-linux-x86_64-2.4.1]# ./bin/mongod --dbpath=/root/db --maxConns=2000
    Wed Apr 3 11:06:21.905 [initandlisten] MongoDB starting : pid=2812 port=27017 dbpath=/root/db 64-bit host=lee
    Wed Apr 3 11:06:21.957 [initandlisten] db version v2.4.1
    Wed Apr 3 11:06:21.957 [initandlisten] git version: 1560959e9ce11a693be8b4d0d160d633eee75110
    Wed Apr 3 11:06:21.957 [initandlisten] build info: Linux ip-10-2-29-40 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_49
    Wed Apr 3 11:06:21.957 [initandlisten] allocator: tcmalloc
    Wed Apr 3 11:06:21.957 [initandlisten] options: { dbpath: "/root/db", maxConns: 2000 }
    Wed Apr 3 11:06:21.982 [initandlisten] journal dir=/root/db/journal
    Wed Apr 3 11:06:21.982 [initandlisten] recover : no journal files present, no recovery needed
    Wed Apr 3 11:06:22.297 [initandlisten] preallocateIsFaster=true 2.62
    Wed Apr 3 11:06:22.717 [initandlisten] --maxConns too high, can only handle 819
    Wed Apr 3 11:06:22.724 [initandlisten] waiting for connections on port 27017
    Wed Apr 3 11:06:22.725 [websvr] admin web console waiting for connections on port 28017
    Wed Apr 3 11:06:25.126 [initandlisten] connection accepted from 192.168.4.86:53917 #1 (1 connection now open)
    查詢最大連接數

    [root@DELL113 mongodb-linux-i686-2.4.1]# ./bin/mongo 192.168.6.42
    MongoDB shell version: 2.4.1
    connecting to: 192.168.6.42/test
    > db.serverStatus().connections
    { "current" : 1, "available" : 818, "totalCreated" : NumberLong(1) }

    發現還是819?其實是Linux默認進程能打開最大文件數有關,可以通過ulimit 解決

    [root@lee mongodb-linux-x86_64-2.4.1]# ulimit -n 2500
    [root@lee mongodb-linux-x86_64-2.4.1]# ./bin/mongod --dbpath=/root/db --maxConns=2000
    Wed Apr 3 11:11:07.013 [initandlisten] MongoDB starting : pid=2930 port=27017 dbpath=/root/db 64-bit host=lee
    Wed Apr 3 11:11:07.013 [initandlisten] db version v2.4.1
    Wed Apr 3 11:11:07.013 [initandlisten] git version: 1560959e9ce11a693be8b4d0d160d633eee75110
    Wed Apr 3 11:11:07.013 [initandlisten] build info: Linux ip-10-2-29-40 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_49
    Wed Apr 3 11:11:07.013 [initandlisten] allocator: tcmalloc
    Wed Apr 3 11:11:07.013 [initandlisten] options: { dbpath: "/root/db", maxConns: 2000 }
    Wed Apr 3 11:11:07.031 [initandlisten] journal dir=/root/db/journal
    Wed Apr 3 11:11:07.031 [initandlisten] recover : no journal files present, no recovery needed
    Wed Apr 3 11:11:07.170 [initandlisten] waiting for connections on port 27017
    Wed Apr 3 11:11:07.171 [websvr] admin web console waiting for connections on port 28017
    Wed Apr 3 11:11:10.076 [initandlisten] connection accepted from 192.168.4.86:53161 #1 (1 connection now open)
    再查看最大連接數,搞定

    [root@DELL113 mongodb-linux-i686-2.4.1]# ./bin/mongo 192.168.6.42
    MongoDB shell version: 2.4.1
    connecting to: 192.168.6.42/test
    > db.serverStatus().connections
    { "current" : 1, "available" : 1999, "totalCreated" : NumberLong(1) }

    關于ulimit的更多知識大家可以去網上檢索檢索

    posted @ 2014-06-10 21:50 paulwong 閱讀(543) | 評論 (0)編輯 收藏

    大數據時代,你準備好了嗎?

    大數據......某比薩店的電話鈴響了,客服人員拿起電話。

    客服:XXX比薩店。您好,請問有什么需要我為您服務?

    顧客:你好,我想要一份……

    客服:先生,煩請先把您的會員卡號告訴我。

    顧客:16846146***。

    客服:陳先生,您好!您是住在泉州路一號12樓1205室,您家電話是2646****,您公司電話是4666****,您的手機是1391234****。請問您想用哪一個電話付費?

    顧客:你為什么知道我所有的電話號碼?

    客服:陳先生,因為我們聯機到CRM系統。

    顧客:我想要一個海鮮比薩……

    客服:陳先生,海鮮比薩不適合您。

    顧客:為什么?

    客服:根據您的醫療記錄,你的血壓和膽固醇都偏高。

    顧客:那你們有什么可以推薦的?

    客服:您可以試試我們的低脂健康比薩。

    顧客:你怎么知道我會喜歡吃這種的?

    客服:您上星期一在中央圖書館借了一本《低脂健康食譜》。

    顧客:好。那我要一個家庭特大號比薩,要付多少錢?

    客服:99元,這個足夠您一家六口吃了。但您母親應該少吃,她上個月剛剛做了心臟搭橋手術,還處在恢復期。

    顧客:那可以刷卡嗎?

    客服:陳先生,對不起。請您付現款,因為您的信用卡已經刷爆了,您現在還欠銀行4807元,而且還不包括房貸利息。

    顧客:那我先去附近的提款機提款。

    客服:陳先生,根據您的記錄,您已經超過今日提款限額。

    顧客:算了,你們直接把比薩送我家吧,家里有現金。你們多久會送到?

    客服:大約30分鐘。如果您不想等,可以自己騎車來。

    顧客:為什么?

    客服:根據我們CRM全球定位系統的車輛行駛自動跟蹤系統記錄。您登記有一輛車號為SB-748的摩托車,而目前您正在解放路東段華聯商場右側騎著這輛摩托車。

    顧客當即暈倒。

    熱烈歡迎-- 大數據時代到來了!

    posted @ 2014-06-09 21:19 paulwong 閱讀(359) | 評論 (0)編輯 收藏

    淺釋BOOTSTRAP

    格式化區域
    Bootstrap Class Description
    panel 
    Denotes a panel with a rounded border. A panel can have a header and a footer.

    panel-heading 
    Creates a heading for a panel.

    btn 
    Creates a button.

    well 
    Groups elements with an inset effect.


    格式化TABLE
    table 
    #Applies general styling to table elements and their contents

    table-striped 
    #Applies alternate-row striping to the rows in the table body

    table-bordered 
    #Applies borders to all rows and columns

    table-hover 
    #Displays a different style when the mouse hovers over a row in the table

    table-condensed 
    #Reduces the spacing in the table to create a more compact layout


    格式化FORM
    <div class="form-group">
        <label>Name:</label>
        <input name="name" class="form-control" />
    </div>







    posted @ 2014-06-09 16:12 paulwong 閱讀(229) | 評論 (0)編輯 收藏

    淺釋ANGULARJS

    1. 導入ANGULARJS庫
      <script src="lib/angular/angular.js"></script>

    2. 通知ANGULARJS引擎開始工作,并設置作用域
      <html ng-app>

    3. 運行一個CONTROLLER,如果里面有設置模型的數據的,就將模型保存下來,此CONTROLLER僅僅可以存取BODY內的所有數據
      <body ng-controller="PhoneListCtrl">

    4. CONTROLLER代碼,其中$scope是ANGULARJS管理的對象,這時就注入到此方法中
      function PhoneListCtrl($scope) {
        $scope.phones = [
          {"name": "Nexus S",
           "snippet": "Fast just got faster with Nexus S."},
          {"name": "Motorola XOOM™ with Wi-Fi",
           "snippet": "The Next, Next Generation tablet."},
          {"name": "MOTOROLA XOOM™",
           "snippet": "The Next, Next Generation tablet."}
        ];
      }

    5. 如遇到雙大括號的標簽,則運行里面的表達式,并將結果更新至DOM顯示
      {{phone.name}}

    6. 根據數組中ITEM的多少,產生相對應的LI標簽
      <ul>
          <li ng-repeat="phone in phones">
            {{phone.name}}
          <p>{{phone.snippet}}</p>
          </li>
        </ul>

    7. 此標簽(指令)會將INPUT的VALUE值與一個叫QUERY的對象進行雙向綁定,任何一方的改變都會同步至對方
      <input ng-model="query">

    8. 使用外部數據,$http是ANGULARJS管理的提供HTTP訪問服務的對象,$scope.phones是往$scope里面新增一個phones,并賦值
      function PhoneListCtrl($scope, $http) {
        $http.get('phones/phones.json').success(function(data) {
          $scope.phones = data;
        });

      }

    posted @ 2014-06-08 11:47 paulwong 閱讀(274) | 評論 (0)編輯 收藏

    ANGULARJS資源

    AngularJS入門教程
    http://www.ituring.com.cn/minibook/303


    AngularJS O'Reilly book
    https://github.com/shyamseshadri/angularjs-book

    angular-phonecat
    https://github.com/angular/angular-phonecat


    教程
    http://scotch.io/tutorials


    http://my.oschina.net/blogshi/blog?catalog=495077


    javaee7-angular
    https://github.com/radcortez/javaee7-angular

    posted @ 2014-06-08 09:38 paulwong 閱讀(247) | 評論 (0)編輯 收藏

    AngularJS 最佳實踐

    AngularJS 是一個 Web 應用框架,它實現了前端的 MVC 架構,能讓開發人員很方便地實現業務邏輯。

    舉個栗子,要做到下面的效果,以前可能需要寫一連串的 JavaScript 代碼綁定 N 多事件。而使用 AngularJS 框架,一句 JavaScript 都不用寫就能實現了,神奇吧?查看演示

    angularjs-demo

        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>     <div data-ng-app>         單價: <input type="number" min=0 ng-model="price" ng-init="price = 299">         <br>         數量: <input type="number" min=0 ng-model="quantity" ng-init="quantity = 1">         <br>         總價: {{ quantity * price }}     </div>

    這得益于 AngularJS 中的雙向數據綁定特性(Two Way Data-Binding),將 Model 和 View 自動關聯了起來,在更復雜的業務場景下,還有代碼分離的好處,將 DOM 操作和應用邏輯解耦,非常實用。

    不過沒有銀彈,和其他框架一樣,AngularJS 也有它的局限。CRUD 類型的操作是它所擅長的,想想看以前寫過的管理后臺,幾乎大部分都是從數據庫中讀取數據,然后呈現在頁面上,進行各種增刪改查。AngularJS 約定了一套規范(約定優于配置),于是你可以很便捷地操作數據。而在其他方面,例如開發復雜的 Web 游戲,AngularJS 則是無用武之地了。

    一、AngularJS 中的精美特性

    雙向綁定

    上面的例子已經說明了,我們可以像 PHP Smarty 模板一樣在 HTML 中寫表達式,用 {{ 和 }} 包起來。在 AngularJS 里,View 和 Model 是在 Controller 里面綁定的,所以無論你在 View 的表單中修改了內容,還是在 Controller 里通過代碼修改了 Model 值,兩邊都會即時發生變化,同步更新。因為 AngularJS 會監控 (watch) Model 對象的變化,隨時反映到 View 中。

    Filter

    Filter 類似 Unix 里面的 | 管道概念,AngularJS 把它搬到了前端。還是舉個例子,你們感受一下——

    <div>{{ 9999 | number }}</div> <div>{{ 9999+1 | number:2 }}</div> <div>{{ 9*9 | currency }}</div> <div>{{ 'Hello World' | uppercase }}</div>

    輸出結果:

    9,999 10,000.00 $81.00 HELLO WORLD 

    二、AngularJS 中的一些“坑”

    由于過去寫 JavaScript 的習慣使然,人們很容易掉進一些 AngularJS 的陷阱里。下面的內容假設你已經了解前端 MVC 概念,并對 AngularJS 有了一定經驗,初學者讀起來可能比較艱深晦澀。

    DOM 操作

    避免使用 jQuery 來操作 DOM,包括增加元素節點,移除元素節點,獲取元素內容,隱藏或顯示元素。你應該使用 directives 來實現這些動作,有必要的話你還要編寫自己的 directives。

    如果你感到很難改變習慣,那么考慮從你的網頁中移除 jQuery 吧。真的,AngularJS 中的 $http 服務非常強大,基本可以替代 jQuery 的 ajax 函數,而且 AngularJS 內嵌了 jQLite —— 它內部實現的一個 jQuery 子集,包含了常用的 jQuery DOM 操作方法,事件綁定等等。但這并不是說用了AngularJS 就不能用 jQuery 了。如果你的網頁有載入 jQuery 那么 AngularJS 會優先采用你的 jQuery,否則它會 fall back 到 jQLite。

    需要自己編寫 directives 的情況通常是當你使用了第三方的 jQuery 插件。因為插件在 AngularJS 之外對表單值進行更改,并不能即時反應到 Model 中。例如我們用得比較多的 jQueryUI datepicker 插件,當你選中一個日期后,插件會將日期字符串填到 input 輸入框中。View 改變了,卻并沒有更新 Model,因為$('.datepicker').datepicker(); 這段代碼不屬于 AngularJS 的管理范圍。我們需要編寫一個directive 來讓 DOM 的改變即時更新到 Model 里。

    var directives = angular.module('directives', []);   directives.directive('datepicker', function() {    return function(scope, element, attrs) {        element.datepicker({            inline: true,            dateFormat: 'dd.mm.yy',            onSelect: function(dateText) {                var modelPath = $(this).attr('ng-model');                putObject(modelPath, scope, dateText);                scope.$apply();            }        });    } });

    然后在 HTML 中引入這個 direcitve

    <input type="text" datepicker ng-model="myObject.myDateValue" />

    說白了 directive 就是在 HTML 里寫自定義的標簽屬性,達到插件的作用。這種聲明式的語法擴展了 HTML。

    需要說明的是,有一個 AngularUI 項目提供了大量的 directive 給我們使用,包括 Bootstrap 框架中的插件以及基于 jQuery 的其他很熱門的 UI 組件。我之前說過 AngularJS 的社區很活躍嘛,生態系統健全。

    ngOption 中的 value

    這是個大坑。如果你去查看 ngOption 生成的 <select> 中的 <option> 的選項值(每個 <option value="xxx"> 的 value 部分),那絕對是枉費心機。因為這里的值永遠都會是 AngularJS 內部元素的索引,并不是你所指定的表單選項值。

    還是要轉變觀念,AngularJS 已經不再用表單進行數據交互了,而是用 Model。使用 $http 來提交 Model,在 php 中則使用 file_get_contents('php://input') 來獲取前端提交的數據。

    {{ }} 的問題

    在頁面初始化的時候,用戶可能會看到 {{ }},然后閃爍一下才出現真正的內容。
    解決辦法:

    1. 使用 ng-cloak directive 來隱藏它
    2. 使用 ng-bind 替代 {{ }}

    將界面與業務邏輯分離

    Controller 不應該直接引用 DOM,而應該控制 view 的行為。例如“如果用戶操作了 X,應該發生什么事情”,“我從哪里可以獲得 X?”

    Service 在大部分情況下也不應該直接引用 DOM,它應該是一個單例(singletons),獨立于界面,與 view 的邏輯無關。它的角色只是“做 X 操作”。

    DOM 操作應該放在 directives 里面。

    盡量復用已有功能

    你所寫的功能很可能 AngularJS 已經實現了,有一些代碼是可以抽象出來復用的,使用更 Angular 的方式。總之就是很多 jQuery 的繁瑣代碼可以被替代。

    1. ng-repeat

    ng-repeat 很有用。當 Ajax 從服務器獲得數據后,我們經常使用 jQuery (比如上面講過的例子) 向某些 HTML 容器節點中添加更多的元素,這在 AngularJS 里是不好的做法。有了 ng-repeat 一切就變得非常簡單了。在你的 $scope 中定義一個數組 (model) 來保存從服務器拉取的數據,然后使用 ng-repeat 將它與 DOM 綁定即可。下面的例子初始化定義了 friends 這個 model

    <div ng-init="friends = [{name:'John', age:25}, {name:'Mary', age:28}]">     I have {{friends.length}} friends. They are:     <ul>         <li ng-repeat="friend in friends">             [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.         </li>     </ul> </div>

    顯示結果

    I have 2 friends. They are:   [1] John who is 25 years old.   [2] Mary who is 28 years old. 

    2. ng-show

    ng-show 也很有用。使用 jQuery 來根據條件控制界面元素的顯示隱藏,這很常見。但是 Angular 有更好的方式來做到這一點。ng-show (以及 ng-hide) 可以根據布爾表達式來決定隱藏和顯示。在 $scope 中定義一個變量:

    <div ng-show="!loggedIn">     點擊 <a href="#/login">這里</a> 登錄 </div>

    類似的內置 directives 還有 ng-disabled, ng-switch 等等,用于條件控制,語法簡潔,都很強大。

    3. ng-class

    ng-class 用于條件性地給元素添加 class,以前我們也經常用 jQuery 來實現。Angular 中的 ng-class 當然更好用了,例子:

    <div ng-class="{ errorClass: isError, warningClass: isWarning, okClass: !isError && !isWarning }">...</div>

    在這里 ng-class 接受一個 object 對象,key 為 CSS class 名,值為 $scope 變量控制的條件表達式,其他類似的內置 directives 還有 ng-class-even 和 ng-class-odd,很實用。

    $watch 和 $apply

    AngularJS 的雙向數據綁定是最令人興奮的特性了,然而它也不是全能的魔法,在某些情況下你需要做一些小小的修正。

    當你使用 ng-model, ng-repeat 等等來綁定一個元素的值時, AngularJS 為那個值創建了一個 $watch,只要這個值在 AngularJS 的范圍內有任何改變,所有的地方都會同步更新。而你在寫自定義的 directive 時,你需要定義你自己的 $watch 來實現這種自動同步。

    有時候你在代碼中改變了 model 的值,view 卻沒有更新,這在自定義事件綁定中經常遇到。這時你就需要手動調用 scope.$apply() 來觸發界面更新。上面 datepicker 的例子已經說明了這一點。第三方插件可能會有 call back,我們也可以把回調函數寫成匿名函數作為參數傳入$apply()中。

    將 ng-repeat 和其他 directives 結合起來

    ng-repeat 很有用,不過它和 DOM 綁定了,很難在同一個元素上使用其他 directives (比如 ng-show, ng-controller 等等)。

    如果你想對整個循環使用某個 directive,你可以在 repeat 外再包一層父元素把 directive 寫在那兒;如果你想對循環內部的每一個元素使用某個 directive,那么把它放到 ng-repeat 的一個子節點上即可。

    Scope

    Scope 在 templates 模板中應該是 read-only 的,而在 controller 里應該是 write-only 的。Scope 的目的是引用 model,而不是成為 model。model 就是我們定義的 JavaScript 對象。

    $rootScope 是可以用的,不過很可能被濫用

    Scopes 在 AngularJS 中形成一定的層級關系,樹狀結構必然有一個根節點。通常我們用不到它,因為幾乎每個 view 都有一個 controller 以及相對應的自己的 scope。

    但偶爾有一些數據我們希望全局應用在整個 app 中,這時我們可以將數據注入 $rootScope。因為其他 scope 都會繼承 root scope,所以那些注入的數據對于 ng-show 這類 directive 都是可用的,就像是在本地 $scope 中的變量一樣。

    當然,全局變量是邪惡的,你必須很小心地使用 $rootScope。特別是不要用于代碼,而僅僅用于注入數據。如果你非常希望在 $rootScope 寫一個函數,那最好把它寫到 service 里,這樣只有用到的時候它才會被注入,測試起來也方便些。

    相反,如果一個函數的功能僅僅是存儲和返回一些數據,就不要把它創建成一個 service。

    三、AngularJS 項目的目錄結構

    怎樣組織代碼文件和目錄?這恐怕是初學者一開始就會遇到的問題。AngularJS 應用開發的官方入門項目angular-seed,其文件結構是這樣的:

    • css/
    • img/
    • js/
      • app.js
      • controllers.js
      • directives.js
      • filters.js
      • services.js
    • lib/
    • partials/

    這種結構對于一個簡單的單頁 app 來說是可行的,只是一旦代碼中存在多個 Controller 或者 Service,就很難找到想要尋找的對象了。我們可以對文件按照業務邏輯進行拆分,就像下面這樣:

    • controllers/
      • LoginController.js
      • RegistrationController.js
      • ProductDetailController.js
      • SearchResultsController.js
    • directives.js
    • filters.js
    • models/
      • CartModel.js
      • ProductModel.js
      • SearchResultsModel.js
      • UserModel.js
    • services/
      • CartService.js
      • UserService.js
      • ProductService.js

    這種結構把不同的業務功能拆分為獨立的文件,條理清晰,但是仍有一定的局限性。最大的問題是一個業務功能的代碼分布在controllers, models, servers 三個不同目錄下,要從中挑出正確的文件,建立起代碼關聯,還是有些麻煩。按照功能進行模塊化劃分目錄結構,應該要更為合理一些:

    • cart/
      • CartModel.js
      • CartService.js
    • common/
      • directives.js
      • filters.js
    • product/
      • search/
        • SearchResultsController.js
        • SearchResultsModel.js
      • ProductDetailController.js
      • ProductModel.js
      • ProductService.js
    • user/
      • LoginController.js
      • RegistrationController.js
      • UserModel.js
      • UserService.js

    這樣也是適合 RequireJS 等模塊加載器的自然直觀的代碼組織方式。

    參考鏈接:

    posted @ 2014-06-05 16:18 paulwong 閱讀(1015) | 評論 (0)編輯 收藏

    針對Java開發者的Apache Camel入門指南

         摘要: Apache Camel是一個非常實用的規則引擎庫,能夠用來處理來自于不同源的事件和信息。你可以在使用不同的協議比如VM,HTTP,FTP,JMS甚至是文件系統中來傳遞消息,并且讓你的操作邏輯和傳遞邏輯保持分離,這能夠讓你更專注于消息的內容。在這篇文章中,我將提供一個Java語言(非Groovy)的Apache Camel入門演示。首先創建一個Maven項目的pom.xml。<?xml&nb...  閱讀全文

    posted @ 2014-06-05 14:00 paulwong 閱讀(4863) | 評論 (0)編輯 收藏

    常用eclipse 快捷鍵


    Ctrl+1 快速修復(最經典的快捷鍵,就不用多說了)
    Ctrl+D: 刪除當前行
    Ctrl+Alt+↓ 復制當前行到下一行(復制增加)
    Ctrl+Alt+↑ 復制當前行到上一行(復制增加)
    Alt+↓ 當前行和下面一行交互位置(特別實用,可以省去先剪切,再粘貼了)
    Alt+↑ 當前行和上面一行交互位置(同上)
    Alt+← 前一個編輯的頁面
    Alt+→ 下一個編輯的頁面(當然是針對上面那條來說了)
    Alt+Enter 顯示當前選擇資源(工程,or 文件 or文件)的屬性
    Shift+Enter 在當前行的下一行插入空行(這時鼠標可以在當前行的任一位置,不一定是最后)
    Shift+Ctrl+Enter 在當前行插入空行(原理同上條)
    Ctrl+Q 定位到最后編輯的地方
    Ctrl+L 定位在某行 (對于程序超過100的人就有福音了)
    Ctrl+M 最大化當前的Edit或View (再按則反之)
    Ctrl+/ 注釋當前行,再按則取消注釋
    Ctrl+O 快速顯示 OutLine
    Ctrl+T 快速顯示當前類的繼承結構
    Ctrl+W 關閉當前Editer
    Ctrl+K 參照選中的Word快速定位到下一個
    Ctrl+E 快速顯示當前Editer的下拉列表(如果當前頁面沒有顯示的用黑體表示)
    Ctrl+/(小鍵盤) 折疊當前類中的所有代碼
    Ctrl+×(小鍵盤) 展開當前類中的所有代碼
    Ctrl+Space 代碼助手完成一些代碼的插入(但一般和輸入法有沖突,可以修改輸入法的熱鍵,也可以暫用Alt+/來代替)
    Ctrl+Shift+E 顯示管理當前打開的所有的View的管理器(可以選擇關閉,激活等操作)
    Ctrl+J 正向增量查找(按下Ctrl+J后,你所輸入的每個字母編輯器都提供快速匹配定位到某個單詞,如果沒有,則在stutes line中顯示沒有找到了,查一個單詞時,特別實用,這個功能Idea兩年前就有了)
    Ctrl+Shift+J 反向增量查找(和上條相同,只不過是從后往前查)
    Ctrl+Shift+F4 關閉所有打開的Editer
    Ctrl+Shift+X 把當前選中的文本全部變味小寫
    Ctrl+Shift+Y 把當前選中的文本全部變為小寫
    Ctrl+Shift+F 格式化當前代碼
    Ctrl+Shift+P 定位到對于的匹配符(譬如{}) (從前面定位后面時,光標要在匹配符里面,后面到前面,則反之)

    posted @ 2014-06-05 10:39 paulwong 閱讀(265) | 評論 (0)編輯 收藏

    僅列出標題
    共115頁: First 上一頁 51 52 53 54 55 56 57 58 59 下一頁 Last 
    主站蜘蛛池模板: 亚洲第一精品在线视频| 亚洲精品成人网站在线播放 | 黄桃AV无码免费一区二区三区| 免费看国产一级特黄aa大片| 国产亚洲Av综合人人澡精品| 免费国产小视频在线观看| 免费无码av片在线观看| 亚洲精品第五页中文字幕| 亚洲最大激情中文字幕| 亚洲黄色免费网站| 国产AV旡码专区亚洲AV苍井空| 国产性生交xxxxx免费| 99久久成人国产精品免费| 亚洲av永久无码精品三区在线4 | 亚洲黄页网在线观看| 亚洲日韩乱码中文无码蜜桃 | 亚洲国产精品无码第一区二区三区| 国产一级理论免费版| 嫩草视频在线免费观看| 久久www免费人成精品香蕉| 亚洲电影在线免费观看| 亚洲成人精品久久| 亚洲av一综合av一区| 国产成人免费a在线视频app | 精品亚洲福利一区二区| 亚洲黄色网址大全| 大胆亚洲人体视频| 免费福利在线播放| 一区二区三区在线免费| 亚洲人成电影在线观看青青| 亚洲自偷自偷图片| 精品亚洲一区二区三区在线观看 | 亚洲国产精品久久久久久| 国产gav成人免费播放视频| 永久免费视频v片www| 三年片在线观看免费大全电影| 亚洲AV一区二区三区四区| 亚洲精品午夜在线观看| 亚洲视屏在线观看| 亚洲一区二区三区91| 亚洲一本一道一区二区三区|