Не удается прочитать свойство 'nid' из неопределенного, необходимо передать объект другому контроллеру - PullRequest
0 голосов
/ 08 ноября 2018

У меня возникают проблемы при попытке передать выбранное значение от одного контроллера другому контроллеру.

Просмотр (я передаю NgValue в область $ в контроллере).

<li class="list-group-item" ng-repeat="item in filterData = (informes | filter:{title:searchTitle, resolucion:searchReso, year: searchYear}) | limitTo:10:10*(currentPage-1)">
                     <div class="wrapper">
                        <div class="informes" ng-value="nodeID(item)">
                          <a ng-href="../node-informes/node-informes.html">
                            <p class="text-center text-truncate">
                               <small>{{item.title}}</small>
                            </p>
                          </a>
                        </div>
                    </div>
                </li>   

Контроллер,У меня есть «Элемент в этом контроллере», и консоль печатает его.

informes.controller('InformesCtrl', ['drupal', '$rootScope', '$scope', '$http', 'InformesFtry', function(drupal, $rootScope, $scope, $http, InformesFtry) {
      $rootScope.getData = function(informes){
          $rootScope.nodeID = function(item){
              $rootScope.node = item.nid;
              console.log($rootScope.node);
          };       
      }
}]);

2-й контроллер в другом модуле (выдает «Не удается прочитать свойство 'nid' неопределенной" ошибки ").

nodeInformes.controller('NodeInformesCtrl', ['$rootScope', '$scope', '$http', '$controller', function($rootScope, $scope, $http, $controller) {
  $controller('InformesCtrl', {$scope: $scope});
  $rootScope.getData(informes);
  $rootScope.nodeID(item);
  $scope.node = $rootScope.node;
  console.log($scope.node);
}]);

Предполагалось, что я вызвал другой контроллер с параметрами (сохраненное значение в "$ rootScope.node", передал его на 2-й контроллер, но выдает ошибку, которая не определена).

consolelog inПервый контроллер работает, но не во втором.

Я ценю любое предложение.

Изменено в соответствии с предложенным кодом, но кажется, что объект "item" не проходит правильный путь.

1 Ответ

0 голосов
/ 09 ноября 2018

Старайтесь избегать использования $rootScope, кроме случаев, когда это абсолютно необходимо (повышение или обработка событий - единственный случай, когда я когда-либо использовал $rootScope) - вместо этого вы можете использовать службу для надежной передачи данных между контроллерами. В AngularJS сервисы являются синглетонами, поэтому все ваши контроллеры имеют доступ к одному и тому же экземпляру. Вы можете воспользоваться этим и использовать сервис для «передачи» (более точного обмена) данных между контроллерами.

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

angular.module('app', [])
  .service('sharedService', function() {
    var service = {};
    service.sharedObject = {};
    service.sharedObject.value = "Set in service";
    return service;
  })
  .controller('ctrlOne', function($scope, sharedService) {
    $scope.sharedObjectC1 = sharedService.sharedObject;
  })
  .controller('ctrlTwo', function($scope, sharedService) {
    $scope.sharedObjectC2 = sharedService.sharedObject;
  });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.7.2/angular.min.js"></script>
<div ng-app="app">
  <div ng-controller="ctrlOne" style="margin-bottom: 30px;">
    <h1>Controller One</h1>
    Modifying this value will update it in Controller Two:
    <div>
      <input ng-model="sharedObjectC1.value" />
    </div>
  </div>
  <hr>
  <div ng-controller="ctrlTwo">
    <h1>Controller Two</h1>
    Modifying this value will update it in Controller One:
    <div>
      <input ng-model="sharedObjectC2.value" />
    </div>
  </div>
</div>
...