【问题标题】:AngularJS - unable to pass ID into another controllerAngularJS - 无法将 ID 传递给另一个控制器
【发布时间】:2016-08-15 16:31:47
【问题描述】:

感谢 JoelCDoyle 对我之前提出的问题 (overflow question) 的帮助,我能够从 JSON 键值中获取一个 ID 并将其传递给另一个控制器,以便在末尾附加一个 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');
  };
}

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

第一个应该和前两个一样简单。我只是复制了上一个,并像以前一样更改了一些内容:

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 控制器中。我大部分时间都被难住了。我很确定这与来自observedCars 控制器的原始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>

第二个我不知道是我的搜索控制器。它与observedCars 控制器做同样的事情。这个还在控制台中记录了正确的 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);
  };
}

非常感谢任何帮助!

【问题讨论】:

  • 您是使用路由参数还是状态参数将值从一个控制器传递到另一个控制器??
  • 您应该查看 ui-router 的文档:github.com/angular-ui/ui-router/wiki/url-routing。您可以轻松地在状态之间传递 id 而不会遇到所有麻烦。
  • 如果所有控制器都使用了 id,那么你将它们与 rootscope 一起使用
  • 注入 rootscope - ['$scope', '$http', 'API', 'CarDetailService', '$state','$rootscope'] 并将 id 存储为 $rootscope.id = ID并在所有控制器中使用它

标签: javascript jquery angularjs json


【解决方案1】:

您是否缺少代码?我认为您应该注入“API”依赖项,如下所示:

不正确

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

正确

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

【讨论】:

  • 其实那是我的错。我正在正确地注入 API,我只是在几分钟前的原始帖子中搞砸了。检查我的编辑,这就是我的做法。它适用于其他两个控制器,但不适用于观察到的汽车,我也不知道如何让它与搜索控制器一起工作。
【解决方案2】:

您需要将该 id 传递给 stateParam,以便您可以在另一个 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);
  };

重要的 $stateParams

controller: function($stateParams){
  $stateParams.contactId  //*** Exists! ***//
}

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

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

在您的控制器中

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

【讨论】:

  • 再次,我不想更改除这两个之外的所有其他控制器上的工作内容。另外,我不相信这会起作用,因为该页面通过 ng-repeat 有 50 个结果。当您单击“查看详细信息”按钮时,我需要获取页面上那些特定的 50 个 ID 之一。查看一周前我们终于开始工作时的原始帖子 - stackoverflow.com/questions/38624433/…
  • 如果您不想使用 stateParam,那么只需服务在控制器之间共享 id
  • 这就是我基本上在做的事情。这篇文章是为了问为什么这在我所有其他控制器上都有效,除了这两个。 CarDetailService 函数正在获取 ID 并将其注入到 API 调用中,在所有其他控制器中都很好。
  • 你的代码没有问题我可以看到只是确保它们是如何加载我的意思是如果你的observedCars控制器在carDetails控制器之后加载那么它不能有id,因为它还没有设置。如果你打印这个 //console.log('Post injection: ' + CarDetailService.carId);它有什么?
  • carDetails 控制器最后加载的是。
【解决方案3】:

纳米。我让它工作了。这是一个用户权限访问问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多