angularJS$broadcast和$on

angularJS$broadcast和$on,angularjs,angularjs-scope,Angularjs,Angularjs Scope,有没有办法让$broadcast在初始化阶段将变量传播到$on <div ng-app='test'> <div ng-controller='testCtrl'> <span>{{testContent}}</span> </div> <div ng-controller="testCtrl2"> <input type='text' ng-change="updateCon

有没有办法让$broadcast在初始化阶段将变量传播到$on

<div ng-app='test'>
    <div ng-controller='testCtrl'> <span>{{testContent}}</span> 
    </div>
    <div ng-controller="testCtrl2">
        <input type='text' ng-change="updateContent()" ng-model="testContent2" />
    </div>
</div>
提琴样品:

由于ng change(ng更改)功能,当输入发生变化时,量程将显示该值

但是,在初始化阶段,值“haha”没有传播到$scope.testContent,因此在第一次运行时没有显示任何内容。有没有办法让值“哈哈”在第一次运行时出现


谢谢。

这样做的原因是,
ng更改
在对
testContent2
标识的模型进行后续更改时触发。当控制器初始化时,将为其分配值“test”<代码>ng更改然后跟踪后续更改-初始分配不符合此条件,只有后续更改符合此条件

-我更新了你提供的小提琴。在这里,您可以看到
span
标记正确地填充了数据

您需要做的不是使用
ng change
,而是使用示波器的
$watch
功能。因此,从输入框中删除
ng change
指令,并删除
updateContent
方法。相反,将其替换为以下代码,您可以在其中查看对
testContent2
模型的更改:

$scope.$watch('testContent2', function () {
    if ($scope.testContent2 === undefined || $scope.testContent2 === null) {
        return;
    }

    sharedContent.setStandardContent($scope.testContent2);

});

您现在可以看到,页面加载时会出现“test”(我找不到任何与“haha”相关的词)。对输入的后续更改也会在
span
中更新。希望这就是你想要的。

你没有考虑的事情是,在控制器初始化之前,应用程序的
运行
阶段执行。因为广播的消息不会得到缓冲,只会提供给消息创建时正在侦听的侦听器,
haha
值会丢失

但是,在您的情况下,只需对控制器进行一点小小的更改,就可以很容易地使其工作:

function testCtrl($scope, sharedContent) {
  updateTestContent();
  $scope.$on('updateContent', updateTestContent);

  function updateTestContent(){
     $scope.testContent = sharedContent.getStandardContent();
  }
}

我在这里分叉了您的JSFIDLE,您可以在控制台上看到每个函数(运行和控制器)何时执行。

只需使用
$timeout
函数提供一点延迟即可。只要在工厂里更新代码,它就会开始工作

请参考以下工厂代码:

app.factory('sharedContent', function ($rootScope,$timeout) {
    var standardContent;
    var resizeProportion;
    return {
        setStandardContent: function (newStandardContent) {
            standardContent = newStandardContent;
            $timeout(function(){
              $rootScope.$broadcast('updateContent');
            },0)
             console.log('broadcast');
        },
        getStandardContent: function () {
            return standardContent;
        },
        setResizeProportion: function (newResizeProportion) {
            $rootScope.$broadcast('updateResizeProportion');
        },
    }
});

您好,我实际上在寻找一种方法,在应用程序的第一次运行时将span初始化为文本“haha”。我认为问题在于,当在app.run函数中调用sharedContent.setStandardContent('haha')时,控制器尚未创建。因此,字符串“haha”在第一次运行时没有填充到span中。我是否可以调用任何其他方法来确保字符串“haha”在第一次运行时填充到span?@jiaming为什么不在TestCtrl2内部将值设置为“haha”,而不是将其设置为“test”?
app.factory('sharedContent', function ($rootScope,$timeout) {
    var standardContent;
    var resizeProportion;
    return {
        setStandardContent: function (newStandardContent) {
            standardContent = newStandardContent;
            $timeout(function(){
              $rootScope.$broadcast('updateContent');
            },0)
             console.log('broadcast');
        },
        getStandardContent: function () {
            return standardContent;
        },
        setResizeProportion: function (newResizeProportion) {
            $rootScope.$broadcast('updateResizeProportion');
        },
    }
});