AngularJS指令的控制器在父控制器之前/之后随机调用

时间:2015-01-16 15:47:24

标签: angularjs angularjs-directive

(ANGULAR VERSION:1.3.8)

我在指令的控制器中“随机”调用异常。当指令的控制器在父控制器之前被调用并且指令控制器中使用的父控制器范围变量尚未初始化时,会发生异常。但是,在'随机'的情况下,我的父控制器在我的指令的控制器之前被调用,因此初始化了范围var,调用工作并且不会抛出异常。我有两个问题(下面有示例代码。):

  1. 为什么指令控制器和父控制器之间的调用顺序中存在“随机性”?即,为什么一个人在另一个之前/之后被召唤?
  2. 我可以通过HTML中的轻微更改消除随机序列,并在我的html中使用长度为1的数组上的ng-repeat,而不是将单个对象传递给我的指令。指令代码保持不变。
  3. 注意:父控制器具有注入ajax调用的服务(o_conversationService)。下面提到的$ scope.thread变量依赖于从ajax调用返回的数据。也许,随机性是根据ajax回调计时,虽然我不清楚如何。无论如何,这并不能解释为什么HTML中的微小变化会消除这个问题。

    以下是使用相同指令代码的两个HTML代码段(第一个是随机工作,第二个是可靠的):

    HTML RANDOM(NOT)工作场景:使用此HTML,cfThread指令的控制器被称为BEFORE父控制器,并抛出异常,因为'$ scope.thread'为空(请参阅下面的指令控制器代码):

    • HTML片段(指令名称:'cf-thread'):

      <cf-thread thread = "o_conversationService.o_thread"></cf-thread> 
      

    HTML工作场景:使用这个HTML,cfThreads指令控制器在父控制器之后被调用,因此'$ scope.thread'被正确初始化(参见下面的指令控制器代码):

    • HTML片段(指令名称:'cf-thread'):

      <cf-thread ng-repeat="threadObject in o_conversationService.o_threadCollection.objectDict" thread="threadObject"></cf-thread>
      

    DIRECTIVE JS(Exception !!!标记如下。例外,因为$ scope.thread为null):

        threadDirectiveModule.directive('cfThread', ['$sce', function ($sce) {
    
        return {
            restrict: 'AEC',
            scope: { 
                thread: '=' 
            },
    
            templateUrl: 'partials/directives/thread.html',
            controller: function ($scope) {
    
                //EXCEPTION!!! $scope.thread is null if parent controller
                //wasn't called first.
                var unsafeDirectLink = cf.Utilities.createExternalDirectLink($scope.thread.dataJSON.source.type, 
                                                      $scope.thread.dataJSON.source.user_id,
                                                      $scope.thread.dataJSON.source.root_id)
    
                if (cf.Utilities.isDefined(unsafeDirectLink)) {
    
                    $scope.thread.safeDirectLink = $sce.trustAsHtml(unsafeDirectLink);
                }
                else {
                    $scope.thread.safeDirectLink = null;
                }       
            }
          };
        }]);
    

    最终注意:在非工作的HTML场景中,我总是可以在指令的控制器中向'$ scope.thread'添加$ watch。毋庸置疑,尽管它有效,但我想在没有必要的情况下避免使用它,正如工作HTML场景所示。

    感谢您的想法和耐心!

0 个答案:

没有答案