美文网首页
AngularJS 指令执行顺序

AngularJS 指令执行顺序

作者: 赵碧菡 | 来源:发表于2017-06-22 18:42 被阅读0次

今天在做一个小demo时遇到了一个问题,开始还以为是作用域的问题,后来发现是因为指令执行顺序导致的。

1、遇到的问题
  • 先看看我的问题吧!这是我运行的代码。
<rating max-stars='var'></rating>

<script type="text/javascript">
        var app = angular.module('app', []);
        app.controller('ratingController',function ($scope) {
            $scope.var="123";
            console.log('外部控制器初始化');
        }).directive('rating', function () {
            console.log("指令初始化");
            return {
                restrict: 'E',
                scope: {
                    maxStars: '='
                },
                controller: 'ratingController',
                link: function (scope, el, attrs) {
                    console.log('link函数',scope.maxStars);
                }
            };   
        });
</script>

  • 控制台输出结果
图片.png
  • 问题原因分析:
    控制台输出 undefined ,是因为指令初始化要比控制器初始化早,当指令初始化,执行指令 <rating max-stars='var'></rating>,此时控制器还没有初始化,并没有var这个变量,所以会出现undefined。
2、 指令执行的顺序
  • 现在我们看看指令执行的顺序是什么样的,先看一段代码吧!
<div ng-controller="ratingController">
    <rating ></rating>
</div>

<script type="text/javascript">
        var app = angular.module('app', []);
        app.controller('ratingController',function ($scope) {
            console.log('外部控制器');
        }).directive('rating', function () {
            console.log("指令初始化");
            return {
                restrict: 'E',
                scope: {
                    maxStars: '='
                },
                //controller: 'ratingController',
                controller:function(){
                    console.log("内部控制器");
                },
                link: function (scope, el, attrs) {
                    console.log('link');
                }
            };   
        });
</script>
  • 执行结果
执行结果.png
  • 从控制台可以看出,指令初始化比控制器初始化早,内部的控制器初始化比链接函数更早执行。
3、问题解决办法

如果想要获得变量,可以在系统初始的时候定义变量并给变量赋值。

//模板
 <my-nav-child  nav-child-product="navChildProduct"></my-nav-child>

//配置系统初始需要的数据      定义变量navChildProduct并赋值给这个变量
 app.run(function($rootScope,classifySer){
        classifySer.get({id:'product'},function(data){
            $rootScope.navChildProduct=data.products;
            console.log('run');
          });
 });
//指令  
.directive('myNavChild',function(){
        console.log('指令初始化');
              return{
                restrict:'AE',
                templateUrl:'js/view/navChild.html',
                replace:true,
                scope:{
                   navChildProduct:'='
                },
                link:function(scope,elem,attrs){
                    console.log('link');
                    console.log(scope.navChildProduct);
                }
              }
       });
       

运行结果

结果.png

从控制台中可以看出,run执行要比指令初始化早。

遇到这个问题查了很多资料,也没有查到满意的结果,上面的分析就是我的理解,不知道是不是这样,伙伴们如果发现什么问题或者有更好解决问题的办法,欢迎评论哦!

相关文章

  • AngularJS 指令执行顺序

    今天在做一个小demo时遇到了一个问题,开始还以为是作用域的问题,后来发现是因为指令执行顺序导致的。 1、遇到的问...

  • AngularJS1.x笔记

    函数 指令 ng-click ng-click 指令告诉了 AngularJS HTML 元素被点击后需要执行的操...

  • Angular相关指令

    AngularJS 指令 本教程用到的 AngularJS 指令 : 指令 描述 ng-app 定义应...

  • AngularJS 参考手册

    AngularJS 指令 本教程用到的 AngularJS 指令 : 过滤器解析 AngularJs 过滤器。 A...

  • AngularJS (2)

    AngularJS 指令 AngularJS 指令是扩展的 HTML 属性,带有前缀 ng-。 ng-app 指令...

  • nginx - 指令执行顺序

    WHY the Directive Execution Order 在Nginx的世界里,程序的执行是分为多个阶段...

  • AngularJS 指令

    AngularJS 指令 背景 什么是AngularJS指令? 一、内置指令 二、自定义 概念 模块对象app,提...

  • AngularJS使用

    AngularJS实现MVC AngularJS模块化Module AngularJS指令系统 AngularJS...

  • Angular基础学习-01

    本节包括:AngularJS表达式、AngularJS指令、AngularJS模型、AngularJS的Scope...

  • 15. Angular的内置指令(过滤器)

    AngularJS中自定义指令处理 以ng开头的指令都是内置指令。 内置指令是AngularJS已经处理,使用内置...

网友评论

      本文标题:AngularJS 指令执行顺序

      本文链接:https://www.haomeiwen.com/subject/kpifcxtx.html