0

<title>我有一个从标签读取同步数据的指令。然后它触发一个$broadcast将数据发送到所有控制器的服务。

但是<body>标签下的控制器没有收到这个。但是,如果我将ng-appattr 从html移至body,并将带有控制器的指令从head移至body。然后所有控制器将正常工作。

这是我的示例代码: http: //jsbin.com/oBAMOs/4/edit ?html,js,console,output

从代码中我相信你几乎可以猜到我想要做什么。那么为什么会发生这种情况,有没有更好的方法来实现呢?

4

2 回答 2

1

navCtrl 在您发送广播时不存在。您可以通过将日志语句放在每个控制器的开头和发送来确认这一点。你会看到你在 navctrl 创建之前发送。(“标题”发生然后“发送”然后“导航”)

解决此问题的一种简单方法是$broadcast在浏览器完成所有当前排队的任务(这将包括渲染 DOM 的其余部分,以及因此 navCtrl 的实例化)之后推送您的直到。您可以通过将广播放置在$timeout延迟为 0 的 a 中来完成此操作。如下:

 $timeout (function() {
    $rootScope.$broadcast('processed');
  },0);

并确保通过超时:

.factory('syncPageid', ['$rootScope','$timeout', function($rootScope,$timeout){

这是 javascript 单线程特性的副产品。有关为什么超时在这里起作用以及潜在问题的讨论,您可以查看:网页中经常使用的零延迟 setTimeout,为什么?http://ejohn.org/blog/how-javascript-timers-work/

于 2013-11-12T04:11:46.350 回答
0

而不仅仅是

$rootScope.$broadcast('processed');

你可以有

$rootScope.$broadcast('已处理', "data_you_need_to_pass_around");

并抓住它

$scope.$on('processed', function (e, args){
    $scope.title = args;
    console.log('titleCtrl: ' + args);
 });

http://jsbin.com/oBAMOs/11/edit

然后当然你的syncPageid工厂可以将它暴露给对pageid感兴趣的所有其他代码位。但是拥有一个工厂只是为了方便在位之间传递数据是没有意义的。

于 2013-11-12T05:11:42.907 回答