AngularJS - невозможно передать идентификатор в другой контроллер

0

Благодаря помощи JoelCDoyle из предыдущего вопроса, который я задал (вопрос переполнения), я могу получить идентификатор из значения ключа JSON и передать его другому контроллеру, чтобы добавить конец вызываемого 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);
  };
}

Как вы можете видеть, у меня есть вывод идентификатора, который регистрируется в консоли, чтобы убедиться, что он захватывает идентификатор, и он это делает. Он печатает на консоли carID и CarDetailService.carId, так что говорит мне, что он захватывает правильный идентификатор, но не вводит его в контроллер carDetails. По большей части я в тупике. Я уверен, что он имеет какое-то отношение к исходному вызову API от наблюдаемого контроллера Cars:

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

Но опять же он по-прежнему захватывает правильный идентификационный бюст, просто не вводит его в контроллер 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>

Второй я не могу понять, это мой поисковый контроллер. Он делает то же самое, что и наблюдаемый контроллер Cars. Он также регистрирует правильный идентификатор автомобиля в консоли, но при изменении состояния он не загружает идентификационную информацию той, которая была захвачена.

Вот этот код:

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);
  };
}

Любая помощь приветствуется!

  • 0
    Вы используете параметры маршрута или параметры состояния для передачи значения от одного контроллера к другому?
  • 0
    Вы должны посмотреть документы для ui-router: github.com/angular-ui/ui-router/wiki/url-routing . Вы можете легко передавать идентификатор между состояниями, не проходя через все эти проблемы.
Показать ещё 6 комментариев

3 ответа

0
Лучший ответ

NM. Я заработал. Это проблема доступа к правам пользователей.

0

Вам нужно передать этот идентификатор в 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 и хотите передать идентификатор другому контроллеру, вы можете просто пройти через свой сервис, который вы используете для хранения идентификатора.

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

в вашем контроллере

  carController.$inject = ['$scope', 'CarDetailService'];
    function observedCars($scope, CarDetailService) {
     function getCarId(){
        return CarDetailService.getCarId;
     }
    }
  • 0
    опять же я не хочу менять то, что работает на всех других контроллерах, кроме этих двух. Кроме того, я не верю, что это сработает, поскольку на странице 50 результатов через ng-repeat. и мне нужно взять один из этих 50 идентификаторов на странице, когда вы нажмете кнопку «Просмотр сведений». Посмотрите оригинальный пост недели назад или около того, когда мы наконец заработали - stackoverflow.com/questions/38624433/…
  • 0
    если вы не хотите использовать stateParam, просто сервис для обмена идентификаторами между контроллерами
Показать ещё 8 комментариев
0

У вас отсутствует код? Я думаю, вы должны ввести "зависимость API", как показано ниже:

НЕПРАВИЛЬНО

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

ВЕРНЫЙ

carDetails.$inject = ['$scope', 'CarDetailService' 'API'];
function carDetails($scope, CarDetailService, API) {
  • 0
    На самом деле это было плохо. Я внедряю API должным образом, я просто облажался в своем оригинальном посте несколько минут назад. Проверьте мою правку, вот как я это делаю. И это работает для двух других контроллеров, но не для наблюдаемых автомобилей, и я не могу понять, как заставить его работать с поисковым контроллером.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню