Angular指令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Angular指令相关的知识,希望对你有一定的参考价值。

基础Angular指令

angularJS提供了一系列的基础ng指令,这些指令可以在DOM元素上执行标准的T/F设置,或页面的准确性加载

 ng-href;
 ng-src;
 ng-disabled;
 ng-checked;
 ng-readonly;
 ng-selected;
 ng-class;
 ng-style。

相对简单,不过多陈述。

指令与作用域

$rootScope是全局变量,这里我们就用一个简单的实例介绍,不做多解释。在mycontroler2中,我们能访问rootpropValue,但不能访问propValue

<!doctype html>
<html>
    <head>
        <script src="http://code.angularjs.org/angular-1.0.1.min.js"></script> 
    </head>
   <body>
    <div ng-app="myApp">
        <div ng-controller=‘mycontroler‘>
                rootPropValue:{{rootpropValue}}
                 propValue:{{propValue}}

                 <button ng-click=‘myAction()‘>button</button>
        </div>
        <div ng-controller=‘mycontroler2‘>
                rootPropValue:{{rootpropValue}}
                propValue:{{propValue||"null"}}
        </div>
    </div>
    <script type="text/javascript" src="controller.js"></script>
  </body>
</html>
 var app=angular.module("myApp",[]);
  app.controller(‘mycontroler‘,function($rootScope,$scope){
      $rootScope.rootpropValue="rootScope";
      $scope.propValue="defualt value";
      $scope.myAction=function(){
          $scope.propValue="action value";
      }
 });
  app.controller("mycontroler2",function($scope){

  });

下面,我们着重说一下父子控制器之间的控制,我们在父子控制器$scope对象中同时控制相同属性值,看效果如下:

<!doctype html>
<html>
    <head>
        <script src="http://code.angularjs.org/angular-1.0.1.min.js"></script> 
    </head>
   <body>
    <div ng-app="myApp">
        <div ng-controller=‘mycontroler‘>
                 
                 propValue:{{propValue}}

                 <button ng-click=‘myAction()‘>button</button>

                 <div ng-controller=‘mycontroler2‘>
                 
                propValue:{{propValue}}
                <button ng-click="myAction2()">button 2</button>
                </div>
        </div>

    </div>
    <script type="text/javascript" src="controller.js"></script>
  </body>
</html>
 var app=angular.module("myApp",[]);
  app.controller(‘mycontroler‘,function($scope){
       
      $scope.propValue="defualt value";
      $scope.myAction=function(){
          $scope.propValue="mycontroler‘s value";
      }
 });
  app.controller("mycontroler2",function($scope){
      $scope.myAction2=function(){
          $scope.propValue="mycontroler2‘s value";
      }
  });

由于原型继承的关系,修改父级对象中的someBareValue会同时修改子对象中的值,但反之则不行。这个例子充分说明了子控制器是复制而非引用propValue

JavaScript对象要么是值复制要么是引用复制。字符串、数字和布尔型变量是值复制。数组、对象和函数则是引用复制。

我们在看下面这个例子,当我们通过一个对象进行传递,看效果:

<!doctype html>
<html>
    <head>
        <script src="http://code.angularjs.org/angular-1.0.1.min.js"></script> 
    </head>
   <body>
    <div ng-app="myApp">
        <div ng-controller=‘mycontroler‘>
                 
                 propValue:{{mymode.propValue|| ‘null‘}}

                 <button ng-click=‘myAction()‘>button</button>

                 <div ng-controller=‘mycontroler2‘>
                 
                propValue:{{mymode.propValue|| ‘null‘}}
                <button ng-click="myAction2()">button 2</button>
                </div>
        </div>

    </div>
    <script type="text/javascript" src="controller.js"></script>
  </body>
</html>
 var app=angular.module("myApp",[]);
  app.controller(‘mycontroler‘,function($scope){
       
      $scope.mymode={propValue:"defualt value"};
      $scope.myAction=function(){
          $scope.mymode.propValue="mycontroler‘s value";
      }
 });
  app.controller("mycontroler2",function($scope){
      $scope.myAction2=function(){
          $scope.mymode.propValue="mycontroler2‘s value";
      }
  });

我们会发现,此时父子控制器中的mymode对象下的propValue是同时变化的。

 

ng-switch:这个指令和ng-switch-when及on="propertyName"一起使用。switch被调用之前我们用ng-switch-default来输出默认值。

<input type="text" ng-model="person.name"/>
<div ng-switch on="person.name">
<p ng-switch-default>输入“yang”看我的变化</p>
<h1 ng-switch-when="yang">{{ person.name }}</h1>
</div>

ng-if:使用ng-if指令可以完全根据表达式的值在DOM中生成或移除一个元素。(注意它是控制DOM是否真实存在,并非控制显隐性)

    <div ng-if="2+2===5">
        不会再DOM中呈现
        </div>
        <div ng-if="2+2===4">
        会显示在DOM中
        </div>

ng-repeat:遍历一个集合或为集合中的每个元素生成一个模板实例。属性包括:

? $index:遍历的进度(0...length-1)。

? $first:当元素是遍历的第一个时值为true。

? $middle:当元素处于第一个和最后元素之间时值为true。

? $last:当元素是遍历的最后一个时值为true。

? $even:当$index值是偶数时值为true。

? $odd:当$index值是奇数时值为true。

<!doctype html>
<html>
    <head>
        <script src="https://code.angularjs.org/1.2.6/angular.min.js"></script> 
        <style type="text/css">
            .odd{
                background-color: blue;
            }
            .even{
                background-color: red;
            }
        </style>
    </head>
   <body>
    <div ng-app="myApp">
        <ul ng-controller="mycontroler">
            <li ng-repeat="person in people" ng-class="{odd:!$odd,even:!$even}">
                {{person.name}} lives in {{person.city}} first:{{$first}} and last:{{$last}} and middle:{{$middle}} and index :{{ $index }} odd:{{$odd}}  even:{{$even}} and class is {{ {odd:!$odd,even:!$even}| json}}
            </li>
        <ul>
    </div>
    <script type="text/javascript" src="controller.js"></script>
  </body>
</html>
 var app=angular.module("myApp",[]);
 app.controller("mycontroler",function($scope){
    $scope.people=[
      {name:‘yang‘,city:"beijing"},
      {name:‘gui‘,city:"nanning"},
      {name:‘yang2‘,city:"nanjing"},
      {name:‘lin‘,city:"beijing"}
    ];
 });

ng-bind:类似于{{}} 可以绑定元素。HTML加载含有{{ }}语法的元素后并不会立刻渲染它们,导致未渲染内容闪烁,可以用ng-bind将内容同元素绑定在一起避免。

            <div ng-init="greeting=‘HelloWorld‘">
            <p ng-bind="greeting"></p>
            </div>

ng-cloak:避免未渲染元素闪烁,还可以在含有{{ }}的元素上使用ng-cloak。

            <div ng-init="greeting=‘HelloWorld‘">
            <p ng-cloak>{{ greeting }}</p>
            </div>

ng-form:用来在一个表单内部嵌套另一个表单。ng-form可以嵌套,内部所有的子表单都合法时,外部的表单才会合法。Angular不会将表单提交到服务器,除非它指定了action属性。

下面的CSS类会根据表单的验证状态自动设置:

? 表单合法时设置ng-valid;

? 表单不合法时设置ng-invlid;

? 表单未进行修改时设置ng-pristion;

? 表单进行过修改时设置ng-dirty。

<!doctype html>
<html>
    <head>
        <script src="https://code.angularjs.org/1.2.6/angular.min.js"></script> 
        <style type="text/css">
            input.ng-invalid {
border: 1px solid red;
}
input.ng-valid {
border: 1px solid green;
}
        </style>
    </head>
   <body ng-app="myApp">
  
<form name="signup_form"
ng-controller="FormController"
ng-submit="submitForm()" novalidate>
      
      <div ng-repeat="field in fields" ng-form="signup_form">
      <input type=‘text‘ name=‘dynamic_input_{{field.fieldName}}‘ ng-required="field.isRequired" ng-model="field.name"  placeholder="{{field.placeholder}}" />
{{field.name}}
          <div
        ng-show="signup_form_input.dynamic_input.$dirty &&
        signup_form_input.dynamic_input.$invalid">
        <span class="error"
        ng-show="signup_form_input.dynamic_input.$error.required">
        The field is required.
        </span>
        </div>
      </div>

<button type="submit"
ng-disabled="signup_form.$invalid">
Submit All
</button>
</form>
    <script type="text/javascript" src="controller.js"></script>
  </body>
</html>
var app=angular.module("myApp",[]);
app.controller("FormController",function($scope){
  $scope.fields=[
    {fieldName:"userName", "placeholder":"foruserName",isRequired:true},
    {fieldName:"password", "placeholder":"forpassword",isRequired:true},
    {fieldName:"email", "placeholder":"foremail",isRequired:false}
  ];
  $scope.submitForm=function(){
    alert("form submit")
  };
})

 

使用ng-if指令可以完全根据表达式的值在DOM中生成或移除一个元素

以上是关于Angular指令的主要内容,如果未能解决你的问题,请参考以下文章

Angular 指令 - 何时以及如何使用编译、控制器、预链接和后链接 [关闭]

Angular2 内置指令 NgFor 和 NgIf 详解

在 Angular 结构指令中使用动态组件会产生额外的 HTML 标记。如何删除或更换它?

angular 啥时候用服务啥时候用指令

angular指令详解--自定义指令

从 Angular js 升级到 Angular 8 的指令