3

リソースをangular.jsに保存した後、リストビューを更新できるように、変更をブロードキャストしたいと思います。

    function EnvironmentCtrl($rootScope,  $scope, $location, $routeParams, environmentService) {
      environmentService.get($scope, $routeParams.id);
      $scope.id = $routeParams.id

      $scope.save = function(){
         $scope.environment.$save(function(data) {
           $rootScope.$broadcast("model-update");
         });
      } 
    }

   function NavController($scope, $http, $routeParams, environmentService) {
     environmentService.list($scope);
     $scope.$on("model-update", function(){
       environmentService.list(function(data){
         $scope.environments = data;
         console.log("update called", $scope.environments); 
       });
     });
   }

EnvironmentCtrl.saveが呼び出されたときのこれらのコントローラー間の通信は正常に機能します。console.logが呼び出され、サービスによってコールバックに返されるデータが$scopeに正しく設定されます。

私のサービスの関連部分は次のようになります。

 services.factory('environmentService', [ '$resource', function($resource) {
   var environmentService = {};

   environmentService.list = function(callback) {
     var url = "/service/environment/"
     $resource(url).query(function(data) {
       callback(data);
     });
    }
    return environmentService;
  } ]);

私の見解は次のようになります。

  <li data-ng-repeat="env in environments">
    <a href="#/environment/{{env.id}}">{{env.name}}</a>
  </li>

ただし、更新されるまで更新されません。

これはすべて「角度の範囲内」であり(私が見る限り)、「正しく機能する」と思っていたでしょう。コールバック内から$digestを呼び出してみました。$ applyは、ダイジェストがすでに進行中であると文句を言います。

ビューが更新されない理由を誰かに教えてもらえますか?

4

1 に答える 1

2

イベントが到着するまでに、モデルが更新されているはずであることに同意します。角度のバグのようです。

それまでは、それがうまくいけば、$timeout内でイベントを発行できます。

$timeout(function() {$rootScope.$broadcast("model-update");}, 0);
于 2013-02-13T12:07:30.043 に答える