控制器无法访问$ rootscope

时间:2016-06-25 09:38:03

标签: javascript angularjs

在我的代码中,我有2个控制器 1.BookListCtrl_Librarian 2.IssueBookCtrl

我有一个名为Books的对象,我在两个控制器中都使用它。

我面临的问题是: 在IssueBookCtrl控制器中,我正在更新Books对象,并且使用相同的对象使用BookListCtrl_Librarian控制器在视图中显示数据。

我使用下面的代码行来更新对象,并希望它将在使用BookListCtrl_Librarian控制器的视图中显示更新的对象。

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

但它给了我错误" TypeError:无法获得属性' 0'未定义或空引用"

总结我无法在这里访问$ rootScope。

请提出建议,非常感谢任何帮助。

由于

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.query = 'Search';
    $scope.issued=[];
    $scope.visibility=function(index) {
        if($scope.issued[index]==false){
            $scope.issued[index]=true;
            return $scope.issued[index];
        }
        else{
            $scope.issued[index]=false;
            return $scope.issued[index];
        }

    }
    $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);
        }
    }]);
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.bookId=$routeParams.bookId;
    $scope.issue = function(Id) {
        alert("issued");
        for (var i = 0, len = $scope.books.length; i < len; i++) {
            if ($scope.books[i].bookId == Id) {
                $rootScope.books[i].issued = true;
                $location.path('/home/librarian');
            }
        }
    }
}]);

2 个答案:

答案 0 :(得分:0)

$scope.books[i]是一个对象,因此请在$rootScope.book中推送该对象,以便稍后通过index访问该对象。

for (var i = 0, len = $scope.books.length; i < len; i++) {
            if ($scope.books[i].bookId == bookId) {
                $rootScope.book.push($scope.books[i]);
                break;
            }
        }
        $location.path('/issue/'+bookId);
    }

答案 1 :(得分:0)

确保实际调用BookData.getData()。在测试中

if($rootScope.books=='undefined'){
    $rootScope.books = BookData.getData();
}

您应该使用typeof进行检查。像这样:

if (typeof $rootScope.books === 'undefined') {
   $rootScope.books = BookData.getData();
}

您的数据可能未定义,但您正在测试字符串'undefined'的相等性。