(ANGULAR VERSION:1.3.8)
我在指令的控制器中“随机”调用异常。当指令的控制器在父控制器之前被调用并且指令控制器中使用的父控制器范围变量尚未初始化时,会发生异常。但是,在'随机'的情况下,我的父控制器在我的指令的控制器之前被调用,因此初始化了范围var,调用工作并且不会抛出异常。我有两个问题(下面有示例代码。):
注意:父控制器具有注入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场景所示。
感谢您的想法和耐心!