angularJS$broadcast和$on
有没有办法让$broadcast在初始化阶段将变量传播到$onangularJS$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
<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');
},
}
});