-1

我正在做广播,在收听广播时,我试图更新我想在视图上显示的范围内的变量,但更改不会立即反映在视图中,直到我点击 UI . 任何人都知道此时应该做什么,我不想使用 $apply。在这里,请找到我的代码。

rApp.factory('pService', ['$http', '$rootScope', '$sanitize', 

function ($http, $rootScope, $sanitize) {

 var pService = {};

 //Some other code

 pService.Update=function(status)
 {
   if(status.LastItemId!=undefined)
   {
     pService.disItemId = status.LastItemId;
     $rootScope.$broadcast('updated',pService.disItemId);    
   }
 }

 //Some other code

return pService;

});


rApp.controller('dController', ['$scope','$rootScope' 'pService' ,dController]);

function dController($scope,$rootScope, pService) {

$rootScope.$on('updated',function (event, data) {
            $scope.lastItemId = data; // I want to display the lastItemId on UI
    })
});
4

2 回答 2

0

是什么触发了正在发送的事件,即您的服务的update()方法在哪里被调用?如果从外部角度调用它,您可能需要使用 apply 来触发摘要循环。我从您正在使用 SignalR 的评论中看到,它不会创建摘要循环来更新角度绑定。尝试将您的电话包装在这样的应用中:

$rootScope.$apply(function(scope) {
    service.Update();
});

你也不需要使用$rootScope.on(),你可以使用$scope.on()。根作用域上的广播将向下传递到所有子作用域。如果该消息未在其他地方使用,您可以使用$rootScope.emit()which bubbles up 并且不会向下通过您的所有子范围。

于 2015-06-05T21:26:28.893 回答
0

理想情况下,服务用于在不同的控制器中共享通用方法。回来就好了this。此外,如果您需要将值返回给控制器,而不是使用事件,为什么不简单地从服务公共方法返回值并访问控制器中的值。此外,控制器的工作是启动或调用服务的方法并更新相应的范围。从服务触发事件以通知控制器类似于什么firing events from one controller to other。服务不是为此目的而提供的。请参阅我的代码以供参考。

演示 - http://plnkr.co/edit/Co7ka0sZKZgYk5Oz88Np?p=preview

JS

var app = angular.module('myApp', []);
app.controller('myController', ['$scope', '$rootScope', 'pService', function ($scope, $rootScope, pService) {
  $scope.name = 'softvar';
  $scope.itemId = pService.Update({LastItemId: 4})

}]);

app.factory('pService', [ '$rootScope', function ( $rootScope) {

 this.pService = {};

 //Some other code

 this.Update= function(status) {
   if (status.LastItemId) {
     this.pService.disItemId = status.LastItemId;
     console.log(this.pService.disItemId)
     return this.pService.disItemId;    
   }
 }

  //Some other code
  return this;

}]);

HTML

<body ng-app="myApp" ng-controller="myController">
    <h1>ItemId is:  {{itemId}}!</h1>
</body>

更新:

演示 - http://plnkr.co/edit/Co7ka0sZKZgYk5Oz88Np?p=preview

JS

var app = angular.module('myApp', []);
app.controller('myController', ['$scope', '$rootScope', 'pService', function ($scope, $rootScope, pService) {
  $scope.name = 'softvar';

  $scope.$on('serviceUpdated', function (ev, data) {
    $scope.itemId = data;
  });

  pService.Update({LastItemId: 4});

}]);

app.factory('pService', [ '$rootScope', function ( $rootScope) {

 this.pService = {};

 //Some other code

 this.Update= function(status) {
   if (status.LastItemId) {
     this.pService.disItemId = status.LastItemId;
     console.log(this.pService.disItemId)
     $rootScope.$broadcast('serviceUpdated', this.pService.disItemId);   
   }
 }

  //Some other code
  return this;

}]);
于 2015-06-05T22:13:48.230 回答