2016-06-27 4 views
0

Я столкнулся с проблемой при совместном использовании объекта $ scope между двумя контроллерами.

В контроллере «IssueBookCtrl» я обновляю значение элемента объекта books, как это.

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

Затем я использую службу $ emit для совместного использования объекта $ scope с помощью контроллера 'BookListCtrl_Librarian'.

$ 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

привет у должны использовать rootscope вместо того, чтобы сфера испускать

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

и в другом контроллере

$rootScope.$on('update_parent_controller', function(event, books){ 
    $scope.books = books; 
}); 
Смежные вопросы