2016-06-27 8 views
0

2つのコントローラ間で$ scopeオブジェクトを共有しているときに問題が発生しています。

コントローラ 'IssueBookCtrl'では、このようなbooksオブジェクトの要素値を更新しています。

$ scope.books [i] .issued = true;

次に、$ scopeオブジェクトをコントローラ 'BookListCtrl_Librarian'と共有するために$ emitサービスを使用しています。

$ scope。$ emit( 'update_parent_controller'、$ scope.books);

しかし、コントローラ 'BookListCtrl_Librarian'を使用しているビューを実行すると、更新されたオブジェクトが表示されません。

controller.js

Controllers.controller('BookListCtrl_Librarian', ['$scope','$http','$location','$rootScope','BookData', 
function ($scope, $http ,$location, $rootScope , BookData) { 
    $http.get('data/books.json').success(function(data) { 
    if($rootScope.books==='undefined'){ 
     $rootScope.books = BookData.getData(); 
    } 
     $scope.books = data; 
    }); 
    $scope.options = ['bookId', 'cost']; 

    $scope.$on("update_parent_controller", function(event, books){ 
     $scope.books = books; 
    }); 
    $scope.issue = function(bookId) { 
     for (var i = 0, len = $scope.books.length; i < len; i++) { 
      if ($scope.books[i].bookId == bookId) { 
       $rootScope.book = $scope.books[i]; 
       break; 
      } 
     } 
     $location.path('/issue/'+bookId); 
    } 
     $scope.return = function (bookId) { 
      for (var i = 0, len = $scope.books.length; i < len; i++) { 
       if ($scope.books[i].bookId == bookId) { 
        $rootScope.book = $scope.books[i]; 
        break; 
       } 
      } 
      $location.path('/return/'+bookId); 
     } 
    $scope.backToLogin = function() { 
     $location.path("/main"); 
    } 
    }]); 
Controllers.controller('IssueBookCtrl', ['$scope','$rootScope','$http','$routeParams','$location', 
function ($scope,$rootScope, $http, $routeParams, $location) { 
    var Id=$routeParams.bookId; 
    $http.get('data/books.json').success(function(data) { 
     $scope.books = data; 
    }); 
    $scope.issue = function(Id) { 
     alert("issued"); 
     for (var i = 0, len = $scope.books.length; i < len; i++) {    
      if ($scope.books[i].bookId === Id) { 
       $scope.books[i].issued = true;    
       $scope.$emit('update_parent_controller', $scope.books); 
       $location.path('/home/librarian'); 
       break; 
      } 
     } 
    } 
}]); 

私を導いてください、任意のヘルプははるかに高く評価されます。

ありがとうございますが、モデルを変更した後、ダイジェストを強制的に試みることができる

答えて

1

$scope.$apply(); 

しかし、私はあなたがそれらの共有モデルとロジックを保持するためにブックサービスを構築することをお勧めします。独自のカスタムサービスを作成する方法については、hereをご覧ください。

または、内部コントローラが$parent変数を使用して外部コントローラのモデルを参照できるように、コントローラを入れ子にすることができます。

スコープ変数が変更されたときに、AngularJsがダーティチェックを実行するため、オブジェクトの更新に問題があってはいけません。

1

HI Uは範囲が

$rootScope.$emit('update_parent_controller', $scope.books); 

発する代わりにrootscopeを使用する必要がありそして他のcontrolerで

$rootScope.$on('update_parent_controller', function(event, books){ 
    $scope.books = books; 
}); 
関連する問題