Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 当插入指令属性时,如何避免启动时的竞争条件?_Angularjs_Angularjs Directive_Race Condition - Fatal编程技术网

Angularjs 当插入指令属性时,如何避免启动时的竞争条件?

Angularjs 当插入指令属性时,如何避免启动时的竞争条件?,angularjs,angularjs-directive,race-condition,Angularjs,Angularjs Directive,Race Condition,应该让事情更清楚,但本质上我是在其指令中指定元素的某些属性(如其id)参数: myApp.directive('myDiv', function () { return { restrict: 'E', replace: true, scope: { 'elementId': '@', 'displayName': '@', }, transclude: true, template: '<div class=

应该让事情更清楚,但本质上我是在其指令中指定元素的某些属性(如其id)参数:

myApp.directive('myDiv', function () {
return {
    restrict: 'E',
    replace: true,
    scope: {
        'elementId': '@',
        'displayName': '@',
    },
    transclude: true,
    template: '<div class="my-div" id="{{elementId}}">{{displayName}}<div ng-transclude></div></div>'
}
myApp.directive('myDiv',function(){
返回{
限制:'E',
替换:正确,
范围:{
“elementId”:“@”,
“displayName”:“@”,
},
是的,
模板:“{{displayName}}”
}
})

问题是,如果我在启动时立即执行一些操作,比如初始化其他指令,那么这些值(例如elementId)还没有插值

换句话说,如果我得到一个myDiv元素的引用并打印它的id,那么在启动时立即打印“{elementId}”。但是如果我等待很短的时间(比如,一秒钟),那么作为值传递给元素id属性的值就会被打印出来(正如我所期望的那样)

如果你一边看小提琴一边打开控制台,你会看到的


我做错了什么?我怎样才能避免这种情况(除了在启动时出现很多非常糟糕的超时情况)?

您有几件事是不正确的。这里有一个新的提琴,您可以看到显示正确值的“起初”日志:

1) 您应该在第二个模板中包含内部元素。您已将transclude设置为true,因此它将替换节点。这也确保了在第一条指令准备就绪之前,第二条指令不会绑定。也就是说,由于它与outter指令一起位于DOM中,因此它可能与wrapping指令不同步

template: '<div class="my-div" id="elementId">{{displayName}}<div my-field></div></div>'

你看过ng斗篷吗?@JoeEnzminger-我以前用过,但这不是展示问题。我的示例大大简化了,但总体思路是:elementId第一次被记录实际上是它自己向另一个服务注册。因此,它不是试图用正确的id注册自己,而是用{{elementId}}注册自己。我不认为ng斗篷适用于这里,但如果我遗漏了什么,请告诉我。谢谢。我尝试将返回的函数更改为链接函数,但得到了相同的行为。同样在您的示例中,我不清楚为什么控制器应该访问名为
elementId
的变量。指令的作用域变量与其控制器有权访问的对象之间有什么关系?我读了更多的内容,似乎像我那样返回函数只是返回链接函数的简写。
angular.module('App').controller('someController',[], function() {
        var controller = {
            init:function(){
                console.log(elementId);
             }
        }
        controller.init();
        return controller;
});


myApp.directive('myDiv', function () {
return {
    restrict: 'E',
    replace: true,
    controller:'someController',
    scope: {
        'elementId': '@',
        'displayName': '@',
    },
    transclude: true,
    template: '<div class="my-div" id="{{elementId}}">{{displayName}}<div ng-transclude></div></div>'
}