隔离作用域何时绑定到AngularJs中的父作用域?

隔离作用域何时绑定到AngularJs中的父作用域?,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,在编译/链接过程的哪个阶段,指令的隔离作用域中的变量绑定到父(控制器)作用域?我有一个应用程序,我希望在加载视图后立即自动调用指令api 我理解作用域绑定,因此在链接后,隔离作用域上公开的变量应该在父作用域上可用 但是,我发现情况并非如此,如下面的代码()所示 //plunker代码 var app=angular.module('plunker',[]); 应用程序控制器('MainCtrl',函数($scope){ $scope.name='World'; $scope.buttonClic

在编译/链接过程的哪个阶段,指令的隔离作用域中的变量绑定到父(控制器)作用域?我有一个应用程序,我希望在加载视图后立即自动调用指令api

我理解作用域绑定,因此在链接后,隔离作用域上公开的变量应该在父作用域上可用

但是,我发现情况并非如此,如下面的代码()所示

//plunker代码
var app=angular.module('plunker',[]);
应用程序控制器('MainCtrl',函数($scope){
$scope.name='World';
$scope.buttonClick=function(){
console.log(“在按钮点击功能中,调用为:“+this.call”);
这个。call();
}
$scope.$on(“链接完成”,函数(事件){
log(“在LinkComplete中,调用为:”+event.currentScope.call);
//event.currentScope.call();
});
log(“在构造函数中,调用为:“+this.call”);
})
.directive('myDirective',function(){
返回{
范围:{
myMethod:“=”
},
控制器:功能($scope){
$scope.myMethod=函数(){
警报(“调用的方法”);
};
},
链接:功能后链接(范围)
{
范围:$emit(“LinkComplete”);
}
};
});
你好{{name}}

呼叫
请注意,在视图初始化期间,代码尝试访问链接变量(指向指令控制器上的方法)两次,并且在这两种情况下,变量都未定义。我不希望该变量在主控制器构造函数期间可用,但我希望它在后链接事件处理程序期间可用。加载视图后,绑定变量可用(单击调用按钮进行见证)


如何从控制器访问绑定变量,而不需要用户单击按钮或类似按钮?

这是一个好问题,当您看到“x是y在z阶段”之类的词时,您需要注意准确性,始终深入源代码以证明这一点

您的plunker正在使用v1.2.27,请检查以下行:

这将在下一个$digest循环中进行评估,然后将分配
parentScope.call
。同时,postLink功能在其正下方同步执行:

执行postLink后,控制器获得事件,但尚未通过$digest初始化
parentScope.call

因此,如果您添加一个setTimeout进行检查,它看起来就像您想要的:

$scope.$on("LinkComplete", function(event) {
    setTimeout(function () {
        console.log("In LinkComplete, call is: " + event.currentScope.call);
        //event.currentScope.call();
    });
});

好的,我本可以说得更清楚(我已经编辑过了)。我的意思是当独立作用域中的变量绑定到父作用域时。@pixelbits为什么不呢?虽然是双向装订。如果在独立作用域中更改它,它将在父作用域中更改为,是吗?@pixelbits如果运行代码并单击调用按钮,您将看到控制器可以通过一个名为Call的作用域变量访问指令控制器上的myMethod()函数。这证明我想要设置的双向绑定设置正确。我的问题是,在编译过程中何时可以访问绑定?@pixelbits请参阅此处有关作用域的部分:。如果你所说的是真的,那么这个变量仍然不会被绑定到buttonClick()控制器方法中,但是它是真的。你有一个观点。你说的有些话我不明白。这与我预期的绑定工作方式背道而驰,但您的plunker证明了它确实是这样工作的-我现在闭嘴:)太好了,谢谢,它工作了!我不知道$timeout/setTimeout(callback)函数会等到当前摘要周期完成后才执行回调。文档中也没有,但它似乎是这样工作的。
isolateScope.$watch(function parentValueWatch() {
  var parentValue = parentGet(scope);
  if (!compare(parentValue, isolateScope[scopeName])) {
    // we are out of sync and need to copy
    if (!compare(parentValue, lastValue)) {
      // parent changed and it has precedence
      isolateScope[scopeName] = parentValue;
    } else {
      // if the parent can be assigned then do so
      parentSet(scope, parentValue = isolateScope[scopeName]);
    }
  }
  return lastValue = parentValue;
}, null, parentGet.literal);
// POSTLINKING
for (i = postLinkFns.length - 1; i >= 0; i--) {
  try {
    linkFn = postLinkFns[i];
    linkFn(linkFn.isolateScope ? isolateScope : scope, $element, attrs,
      linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), transcludeFn);
  } catch (e) {
    $exceptionHandler(e, startingTag($element));
  }
}
$scope.$on("LinkComplete", function(event) {
    setTimeout(function () {
        console.log("In LinkComplete, call is: " + event.currentScope.call);
        //event.currentScope.call();
    });
});