2015-10-30 2 views
3

Я преобразовал один из моих угловых контроллеров в контроллер как синтаксис, но у меня возникли проблемы с получением шаблона ng-grid для игры.

Контроллер имеет функцию под названием редактирования пользователем, который выглядит как этот

self.editUser = function (user_data) { 
    var modalInstance = $modal.open({ 
     templateUrl: '/admin/views/adminuser.html', 
      controller: 'AdminUserController', 
      resolve: { 
       user_data: function() { 
        return user_data; 
       } 
      } 
     }); 

     modalInstance.result.then(function() { 
      self.myQueryData.refresh = !self.myQueryData.refresh; 
     }); 
    }; 

шаблон нг-сетка выглядит следующим образом

<div class="ngCellText" ng-class="col.colIndex()"> 
    <a ng-click="$parent.$parent.$parent.$parent.editUser({user_id:row.entity.id, first_name:row.entity.first_name, last_name:row.entity.last_name, email:row.entity.email})"> 
     <span ng-cell-text translate>Edit</span> 
    </a> 
</div> 

и мой маршрут выглядит следующим образом

.when('/admin/settings', { 
    templateUrl: '/admin/views/settings.html', 
    controller: 'SettingsController as sc', 
}) 

Так что проблема в шаблоне, когда я звоню

$parent.$parent.$parent.$parent.editUser 

он не знает, что я имею в виду, если я не включать имя контроллера, как

$parent.$parent.$parent.$parent.sc.editUser, 

то он прекрасно работает. Однако я не хочу привязывать этот шаблон непосредственно к контроллеру sc. Как я могу вызвать editUser без использования имени контроллера?

Я надеялся, что там будет функция на $ родителю, которая будет поставлять имя функции как

$parent.$parent.$parent.$parent.getController().editUser 

Любые предложения?

+0

Я должен добавить, я знаю, что я могу получить эту работу добавив функцию в scop e, я не хочу этого делать. – ryanmc

+0

Хм ... это много «$ parent». [Аналогичная проблема ngGrid] (http://stackoverflow.com/a/23698748/639753) – Xeon

ответ

0

Поскольку вы используете синтаксис controllerAs, вы можете обратиться контроллер под псевдонимом, поэтому фактический шаблон линия будет выглядеть следующим образом:

<a ng-click="sc.editUser({user_id:row.entity.id, first_name:row.entity.first_name, last_name:row.entity.last_name, email:row.entity.email})">

+1

Как я уже сказал в вопросе, я не хочу привязывать этот шаблон к этому конкретному контроллеру. Я хочу, чтобы его можно было использовать несколькими контроллерами. – ryanmc

+0

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

+0

, что затрудняло бы работу контроллеров гнездования. Я попробую трансляцию – ryanmc

0

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

пример:

<div ng-app="MyApp"> 
<div ng-controller="MyController"> 
    {{myMessage}} 
    <div ng-controller="MyController2"> 
     <div ng-controller="MyController3"> 
      <div ng-controller="MyController4"> 
       <button id="myButton" ng-click="setMessage('second')">Press</button> 
      </div> 
     </div> 
    </div> 
    <script> 
     angular.module('MyApp', []) 
      .controller('MyController', function($scope) { 
      $scope.myMessage = "First"; 
       $scope.setMessage = function(msg) { 
       $scope.myMessage = msg; 
       }; 
     }).controller('MyController2', function($scope) { 

      }).controller('MyController3', function($scope) { 

      }).controller('MyController4', function($scope) { 

      }); 
    </script> 

</div> 
</div> 

Или же вы можете использовать угловые $ радиопередачу

+0

По какой-то причине это не работает с ng-сеткой. – ryanmc

Смежные вопросы