AngularJS學習 註冊服務 自訂指令

來源:互聯網
上載者:User

AngularJS 註冊服務

AngularJS的後台控制可以在Controller裡面實現. 可是如果所有的邏輯代碼都寫到Controller會顯得該Controller過於臃腫. 不方便維護, AngularJS提供了一個可以依賴注入的方法。我們可以將邏輯處理封裝到Service中,需要調用只需要引入對應的Service即可.

Angular 提供了3種方法來建立並註冊我們自己的 service.

1.Factory

2.Service

3.Provider

一. Factory:

1. 下面構建了一個MyFactory, 用於設定個人資訊,並展示個人資訊。

Note: 1. 必須在裡面調用return 否則會報錯

2. 所有的可訪問的方法都放到了Service裡面


app.factory('MyFactory',function(){

   var service = {};
   var _name = '';
   var _age = '';

   service.SetInfo = function(name,age){
         _name = name;
         _age = age;
   }

   service.ShowInfo = function(){
         return _name+':'+_age;
   }

   return service;
});



2. 可以將通過function(MyFactory)中將服務註冊到Controller中. 控制台就會列印出Frank:23

var app = angular.module('myapp')
app.controller('InjectCtrl',function ($scope,MyFactory) {
   MyFactory.SetInfo('Frank',23);
   console.log(MyFactory.ShowInfo());
});    

二. Service

1. Service與Factory用法差不多,區別在於不需要Return一個對象.           


var app = angular.module('myapp')

app.controller('InjectCtrl',function ($scope,MyService) {
   MyService.SetInfo('Frank',23);
   console.log(MyService.ShowInfo())
});

app.service('MyService', function(){
   var _name = '';
   var _age = '';

   this.SetInfo = function(name,age){
          _name = name;
          _age = age;
   }

   this.ShowInfo = function(){
          return _name+':'+_age;
   }
});



三. Provider:

1. Provider: 通過#Get方法實現資料的返回.              


app.provider('MyProvider',function(){

     var service = {};
   var _name = '';
   var _age = '';

   service.SetInfo = function(name,age){
         _name = name;
         _age = age;
   }

   service.ShowInfo = function(){
         return _name+':'+_age;
   }

   this.$get = function(){
         return service;
   }
});



AngularJS 自訂指令


在前端開發中, 我們會遇到很多地方都會用到同一種類型的控制項。AngularJS提供了自訂指令功能,我們可以在指令裡面定義特定的html模板。提供給前台html調用.

一. 指令的簡單定義.

下面定義了一個簡單的控制項,點擊後調轉到部落格園。

Note: 1.命名方式:directive必須以小寫字母開頭,其中如果後面由大寫字母,html調用的時候就要用 - 將單詞分開.

<html>
<script src='angular.js'></script>
<script type="text/javascript">
angular.module('myapp',[])
    .directive('myCnblogs',function(){
        return {
            restrict: 'E',
            replace: false,
            template:'<a href="http://www.cnblogs.com/">Go to cnblogs</a>'
        }
    })
</script>
<head>
    <title></title>
    <div ng-app='myapp'>
      <my-Cnblogs></my-Cnblogs>
    </div>
</head>
<body>
</body>
</html>

二.指令元素介紹:

2.1  restrict

常用的restrict有E,A,C三種設定。這些設定可以混用,比如EA,AC。不需要符號隔開

E(Element):元素,使用格式是<my-directive></my-directive>

A(Propertity): 屬性,使用格式:<div my-directive></div>

C(Class): 類, 使用格式:<div class='my-directive'></div>

2.2 repleace

下面是Replace分別設定false和True的效果


            

2.3 termplate:

template 是設定對應的html模板, 如果有html換行那就要在每一句末尾加上 / 符號. 如果html代碼較多,可以通過設定templateurl: urlpath,來載入對應當的代碼模板

三. 向指令內部添加資料

3.1 下面通過設定scope簡單的實現了資料的綁定.

<!DOCTYPE html>
<html>
<script src='angular.js'></script>
<script type="text/javascript">
angular.module('myapp',[])
    .directive('myDirective', function() {
        return {
            restrict: 'A',
            replace: true,
            scope:{
                myurl:"@",
                mycontent:"@"
            },
            template: '<a href="{{myurl}}">{{mycontent}}</a>'
        };
    });
</script>
<head>
    <title></title>
    <div ng-app='myapp'>
       <div my-Directive myurl='http://www.cnblogs.com/' mycontent='go to blogs'></div>
     </div>
</head>
<body>
</body>
</html>


3.2 深入理解自訂控制項scope的綁定

自訂控制項綁定$scope分為 @,=,& 三種情況。個人認為@:單向綁定,=:雙向繫結,&: 用於綁定函數,下面看看Angularjs權威指南的介紹

@  本地範圍屬性:使用@符號將本地範圍同DOM屬性的值進行綁定。

=  雙向繫結:通過=可以將本地範圍上的屬性同父級範圍上的屬性進行雙向的資料繫結。 就像普通的資料繫結一樣,區域屬性會反映出父資料模型中所發生的改變

&  父級範圍綁定 通過&符號可以對父級範圍進行綁定,以便在其中運行函數。意味著對這個值進行設定時會產生一個指向父級範圍的封裝函數.   

下面的demo實現了對三種情況的綁定.      


<!DOCTYPE html>
<html>
<script src='angular.js'></script>
<script type="text/javascript">
angular.module("myApp", [])
        .directive("myDir", function() {
        return {
            restrict: "A",
            scope: {
                 name: "@",   
                 desc: "=",
                 show: "&"    
            },
            template:
                      "<div>" +
                      "  <input type='text' ng-model='name' />: <input ng-model='desc' />" +
                      "  <button ng-click='show()'>show</button>" +
                      "</div>",
            replace: true,
            link: function (scope, element, attrs) {
                console.log("initial value for name:" + scope.name);
                console.log("initial value for description:" + scope.amount);
                scope.$watch("desc", function (newVal, oldVal) {
                    console.log("desc has changed " + oldVal + " >> " + newVal);
                });        
                scope.$watch("name", function (newVal, oldVal) {
                    console.log("name has changed " + oldVal + " >> " + newVal);
                });
            }
        }
    })
    .controller("myCtrl", function($scope) {
            $scope.customerName = "Frank";
            $scope.content = 'Learning Angular';
            $scope.show = function(source) {
                alert(source);
              };
    })

</script>
<head>
<meta charset="utf-8" />
    <title></title>
</head>
<body ng-app="myApp" ng-controller="myCtrl">

    <h3>普通的Angular</h3>
    <input type="text" ng-model='customerName'>: <input ng-model="content" />
    <button ng-click="show('普通函數')">show</button>
    
    <h3>自訂指令</h3>
    <div my-dir
      name="{{customerName}}"
      desc="content"
      show="show('自訂指令綁定函數')">
    </div>
</body>
</html>

下面是效果圖:



四. 總結:

本篇章介紹了自訂指令的簡單實用. 可以通過自訂指令封裝很多特定功能的html模板,供頁面調用。 大家可以試一試將上面demo的 & 修改為 @或者=,經測試修改為@符號,自訂指令的show方法是無法執行的。如果修改為=號就很有意思了。點擊上面的btn,會執行兩次show方法。 然後修改任何一個input,下面的show方法都會被執行。如果有博友知道是什麼原因也請線上回複一下。這個原理實在不清楚是什麼原因。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.