AngularJS - 无法将ID传递到另一个控制器

时间:2016-08-15 16:31:47

标签: javascript jquery angularjs json

感谢JoelCDoyle在我之前提出的问题(overflow question)的帮助下,我能够从JSON键值中获取一个ID并将其传递给另一个控制器,以便为API附加一个API地址被呼叫。

以下是上一篇文章中的代码:

CarDetailService.$inject = ['$http', 'API'];
function CarDetailService($http, API) {
  var CarDetailService = this;
  CarDetailService.setCar = function(carId) {
    CarDetailService.carId = carId;
  };

  CarDetailService.getCar = function() {
    return $http.get(API + "/car/" + CarDetailService.carId);
  };
}

myTasks.$inject = ['$scope', '$http', 'API', 'CarDetailService', '$state'];
function myTasks($scope, $http, API, CarDetailService, $state) {
  $http.get( API + '/tasks' ).
  success(function(data) {
    $scope.mainTask = data;
    console.log(data);
  });

  $scope.selectCar = function(carId) {
    CarDetailService.setCar(carId);
    $state.go('taskDetails');
  };
}


// EDITED
carDetails.$inject = ['$scope', 'CarDetailService', '$http', 'API'];
function carDetails($scope, CarDetailService, $http, API) {
  // console.log('Post injection: ' + CarDetailService.carId);
  CarDetailService.getCar().success(function(details) {
    $scope.details = details;
  });
}

现在我已经能够将它添加到另一个控制器,只需复制另一个控制器中的代码并更改一些类似的东西:

myCars.$inject = ['$scope', '$http', 'API', 'CarDetailService', '$state'];
function myCars($scope, $http, API, CarDetailService, $state) {
  $http.get( API + '/car' ).
  success(function(data) {
    $scope.myCars = data;
    console.log(data);
  });

  $scope.selectCar = function(carId) {
    CarDetailService.setCar(carId);
    $state.go('taskDetails');
  };
}

但是现在我还有两个其他控制器需要添加它,我似乎无法让它们工作。

First One 应该和前两个一样简单。我刚刚复制了前一个并改变了一些像我之前做过的事情:

observedCars.$inject = ['$scope', '$http', 'API', 'CarDetailService', '$state'];
function observedCars($scope, $http, API, CarDetailService, $state) {
  $http.get( API + '/car/?observed=true&offset=0&page_size=20' ).
  success(function(data) {
    $scope.observed = data;
    console.log(data);
  });

  $scope.selectCar = function(carId) {
    console.log('Car ID is ' + carId);
    CarDetailService.setCar(carId);
    $state.go('taskDetails');
    console.log( 'Get Car is ' + CarDetailService.carId);
  };
}

正如您所看到的,我已将id的输出记录到控制台中,以确保它正在抓取ID,但确实如此。它在控制台中打印carID和CarDetailService.carId,这样就可以告诉我它正在抓取正确的id,但它没有将它注入 carDetails 控制器。我大部分时间都很难过。我很确定它与来自observeCars控制器的原始API调用有关:

 /?observed=true&offset=0&page_size=20

但是它仍然抓住了正确的ID胸围只是没有将它注入 carDetails 控制器。

HTML ng-click引用如下:

<div ng-repeat="task in mainTask.Tasks" class="myCar">
    <div class="viewCar"><a ng-click="selectCar(task['CAR ID'])">View Details</a></div>
</div>

<div ng-repeat="car in myCars['My CARs']" class="myCar">
    <div class="viewCar"><a ng-click="selectCar(car['CAR ID'])">View Details</a></div>
</div>

<div dir-paginate="obv in observed['Observed CARs'] | filter:q | itemsPerPage: 5" class="myCar">
    <div class="viewCar"><a ng-click="selectCar(obv['CAR ID'])">View Details</a></div>
</div>

第二个我无法弄明白是我的搜索控制器。它与observeCars控制器完全相同。这个也会在控制台中记录正确的CAR ID,但是当状态发生变化时,它不会加载它抓取的ID信息。

以下是代码:

function searchRes($scope, $http, API){

  $scope.$watch('search', function() {
    fetch();
  });

  $scope.currentPage = 1;
  $scope.pageSize = 5;

  function fetch(){
    $http.get(API + "/search/" + $scope.search)
    .then(function(data){ 
      $scope.results = data;
    });
  }

  $scope.select = function(){
    this.setSelectionRange(0, this.value.length);
  }

  $scope.selectCar = function(carId) {
    console.log('Car ID is ' + carId);
    CarDetailService.setCar(carId);
    $state.go('taskDetails');
    console.log( 'Get Car is ' + CarDetailService.carId);
  };
}

任何帮助都是非常感谢!

3 个答案:

答案 0 :(得分:0)

你有丢失的代码吗?我认为你应该注入“API”依赖关系,如下所示:

不正确

carDetails.$inject = ['$scope', 'CarDetailService'];
function carDetails($scope, CarDetailService, API) {

CORRECT

carDetails.$inject = ['$scope', 'CarDetailService' 'API'];
function carDetails($scope, CarDetailService, API) {

答案 1 :(得分:0)

您需要将该ID传递给controller,以便您可以在其他 $scope.selectCar = function(carId) { console.log('Car ID is ' + carId); CarDetailService.setCar(carId); $state.go('taskDetails',{ carId:carId }); console.log( 'Get Car is ' + CarDetailService.carId); };

中获取该ID
controller: function($stateParams){
  $stateParams.contactId  //*** Exists! ***//
}

重要$ stateParams

 CarDetailService.getCarId = function() {
    return CarDetailService.carId;
  };

如果您不想使用stateParam并且只想将id传递给另一个控制器,您只需通过用于存储ID的服务。

  carController.$inject = ['$scope', 'CarDetailService'];
    function observedCars($scope, CarDetailService) {
     function getCarId(){
        return CarDetailService.getCarId;
     }
    }
控制器中的

{{1}}

答案 2 :(得分:0)

NM。我搞定了。这是用户权限访问问题。