2016-09-28 55 views
0

我收到了Angular的这个令人讨厌的错误,我向指令广播了数据,但指令的$on没有收到它。指令数据有时不会在广播后出现

因此,我的表格根本不填充,看起来对用户来说很糟糕。

test_results.html(包含指令的实例):

<div> 
    <h1>Test Results</h1> 
    ... 
    <results></results> 
</div> 

resultsCtrl.js控制器:

$timeout(function() { 
    $rootScope.$broadcast('show-results', test_session.question_objects); 
}, 100); 

results.html指令模板(去掉了大多数领域):

<div class="results"> 
    <table class="table table-bordered table-striped"> 
     <thead> 
      <tr> 
       <td ng-if="average_times && !$root.is_mobile"> 
        <span ng-click="sortType = 'question.average_timing'; sortReverse = !sortReverse"> 
         Avg. Time 
        </span> 
       </td> 
      </tr> 
     </thead> 
     <tbody> 
      <tr ng-repeat="q in questions | orderBy:sortType:sortReverse | filter:searchQuestions track by $index"> 
       <td ng-if="q.average_timing && !$root.is_mobile" ng-click="$root.openDirections('question', q)">{{ q.average_timing }}</td> 
      </tr> 
     </tbody> 

    </table> 
</div> 

results.js指令:

scope.$on('show-results', function(event, test_session) { 
    setTestSessionData(test_session); 
}); 
... 
function setTestSessionData (test_session) { 
    scope.questions = test_session; 
} 

我不知道什么时候发生这种情况。起初,我认为这是我第一次加载该网站,但我已经尝试过,因为和数据呈现。

回答

0

每当你做$rootScope.$broadcast所有通过$scope.$on注册到这些事件的子范围将捕获该事件。指导范围也一样。如果您在事件侦听器中更新模型,它将在视图中更新。

工作plunker:https://plnkr.co/edit/4iokGsfPH5IqNdecjaGd?p=preview

+0

所以,你真的做不同在这里的唯一的事情是父母的结果结合指令:'<结果得到数据=“父(结果)”>'然后'结果:'&''。我很困惑这是如何确保数据在'$ on'中被接收的。 '$ on'不应该在收听它订阅的广播吗? – Growler

+0

忽略绑定部分,我只是补充说,唯一必须注意的是,每当你从父控制器进行广播时,它都会通过$ on在局部范围 –

+0

Sasank上听$,我仍然不明白。我已经完成的范围设定和您所做的工作有什么不同,您为什么总是确保内容已加载? – Growler