Javascript 使用templateURL呈现角度指令的顺序

Javascript 使用templateURL呈现角度指令的顺序,javascript,jquery,angularjs,angularjs-directive,Javascript,Jquery,Angularjs,Angularjs Directive,我有下面的场景,简化为 我试图在父向导元素中运行一些代码,在它的所有步骤呈现之后。在此上下文中,控制台日志按其应该的方式生成: 1.第一步。 2.步骤二 3.巫师 但是,当我将任何步骤的模板更改为带有实际HTML的templateURL时,顺序会变得混乱,我无法找到确保向导中的功能最后运行的方法 我在向导指令中尝试过这个概念,但它仍然不适合我 $timeout(function () { //DOM has finished rendering }); 有一个已知的解决方案吗?我对答案

我有下面的场景,简化为

我试图在父向导元素中运行一些代码,在它的所有步骤呈现之后。在此上下文中,控制台日志按其应该的方式生成: 1.第一步。 2.步骤二 3.巫师

但是,当我将任何步骤的模板更改为带有实际HTML的templateURL时,顺序会变得混乱,我无法找到确保向导中的功能最后运行的方法

我在向导指令中尝试过这个概念,但它仍然不适合我

$timeout(function () {
    //DOM has finished rendering
});

有一个已知的解决方案吗?

我对答案做了一个简单的解释。然而,我不明白你为什么要这么做。基本上,您可以让服务跟踪init计数,以确保两个指令都已初始化。观察此跟踪器的值,并在其变化时进行测试。卡萨姆

因为服务是单例和持久的,所以在向导指令初始化时,您可能希望将计数重置为零

代码如下:

    var myApp = angular.module('myApp', []);

myApp.service("initState", function(){
return{
    initCount:0,
  finishStep:function(){
    this.initCount++;
  }
}

});

myApp.directive("wizard",function(initState){
    return {
    link: function($scope){
        $scope.$watch(function(){
        return initState.initCount;
      }, function(){
      console.log('init count', initState.initCount );
        if( initState.initCount === 2){
            console.log('link on wizard');
        }
      })

    },
        restrict: "E",
        template: "<step-1></step-1><step-2></step-2>"
    }
});

myApp.directive("step1", function(initState){
    return {
    link: function(){
        console.log('link on step1');
      initState.finishStep();
    },
        restrict: "E",
        template: "<h1>Step1</h1>"
    }
});

myApp.directive("step2", function(initState){
    return {
    link: function(){
        console.log('link on step2');
       initState.finishStep();
    },
        restrict: "E",
        template: "<h1>Step2</h1>"
    }
});
var myApp=angular.module('myApp',[]);
myApp.service(“initState”,function()){
返回{
初始化计数:0,
finishStep:function(){
这个.initCount++;
}
}
});
指令(“向导”,函数(initState){
返回{
链接:功能($scope){
$scope.$watch(函数(){
返回initState.initCount;
},函数(){
log('init count',initState.initCount);
if(initState.initCount==2){
log(“向导上的链接”);
}
})
},
限制:“E”,
模板:“”
}
});
myApp.指令(“step1”,函数(initState){
返回{
链接:函数(){
console.log('step1上的链接');
initState.finishStep();
},
限制:“E”,
模板:“步骤1”
}
});
myApp.指令(“step2”,函数(initState){
返回{
链接:函数(){
console.log('step2上的链接');
initState.finishStep();
},
限制:“E”,
模板:“步骤2”
}
});

不清楚订单有什么问题。试着更新这个演示来复制你的问题……你到底想做什么?通常,我试图通过运行$(“#向导”).steps()来初始化这个JQuery插件();(需要在呈现所有内容后运行)。事情是这样的。如果我在向导的link函数上运行它,它将在呈现其余步骤之前运行。因此无法正确初始化。在您的示例中,您可以看到向导日志是如何在其余步骤之前写入控制台的,而我需要的是它在所有步骤都已呈现之后最后运行。要执行什么操作?你没有提到你的主要目标是什么,但是我对这种方法有一个问题。由于我的步骤数可能会发生变化,有些步骤可能会在以后添加,有些步骤可能会删除。我不想为此管理initCount编号(在本例中为“2”)。我希望根据渲染的步骤数自动管理此操作。事实是,您可能做错了。不管你在做什么(你没有解释)。也就是说,你可以存储一个由每个指令的名称或任何名称调用的布尔值,并在指令运行时将其设置为true。。。但是,对于可能有不同解决方案的问题,依赖交叉指令初始化是一种变通方法。