2016-07-30 2 views
0

У меня возникли проблемы с пониманием наследования областей видимости, и я изо всех сил старался передать объекты данных из родительского контроллера в дочерний контроллер, но я не могу показаться заставить работать. Может кто-нибудь объяснить, почему это не работает? Спасибо!Контроллер ребенка, не наследующий от родительского контроллера

EDIT: Я не уточнил, это раньше, но это требование проекта использовать стиль руководства Джон Папа, так что я не могу решить эту проблему с помощью $scope ни в одном из контроллеров.

UPDATE: Кажется, я понял цель использования this ... на основе помощи плакатов ниже, теперь я понимаю, что некоторые действия требуют использования $scope и стиль руководства Джона папиной просто просит разработчиков использовать this когда целесообразно, чтобы избежать конфликтов области видимости, а не в качестве замены для сферы

JS

//parent.controller.js 
(function() { 
    'use strict'; 

    angular 
     .module('app') 
     .controller('ParentController', ParentController); 

    ParentController.$inject = ['$scope']; 

    function ParentController($scope) { 
     var vm = this; 
     console.log(this); 
     vm.test = {}; 
     vm.test.label = "This is being set in the parent controller."; 
    } 
})(); 

//child.controller.js 
(function() { 
    'use strict'; 

    angular 
     .module('app') 
     .controller('ChildController', ChildController); 

    ChildController.$inject = ['$scope']; 

    function ChildController($scope) { 
     var vm = this; 
     vm.test = vm.test; 
    } 
})(); 

HTML

<div ng-controller="ParentController as vm"> 
    <div>PARENT: {{vm.test.label}}</div> 
    <div ng-controller="ChildController as vm"> 
      <div>CHILD: {{vm.test.label}}</div> 
    </div> 
</div> 

РЕЗУЛЬТАТ

PARENT: 'This is being set in the parent controller.' 
CHILD: 
+0

У вас должен быть только один модуль, почему вы объявляете два модуля? – Aparna

+1

Проверьте это plunkr, https://plnkr.co/edit/bs9Zaba0yW8lqlStoe7Z?p=preview – Aparna

+0

@Aparna большое спасибо за помощь. Этот plunkr работает, но [против стиля John Papa использовать $ scope] (https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#controllers), и это требование проекта соблюдать по этому руководству по стилю. Просто обновил мой пост с этой информацией, так как я не указывал ранее. – Spencer

ответ

3

Издание является: ут также часть самого $ объема. Таким образом, у вас не может быть такого экземпляра для родителя & Ребенок-контроллер. В противном случае вы столкнетесь с проблемами при их использовании. Если вы хотите изолировать этот экземпляр для родителя & Ребенок затем дает разные имена. Поскольку ВМ также часть контроллера, так что если вы хотите получить доступ к виртуальной машине Родителя внутри контроллера ребенка, то вам придется сделать $scope.vm

Рабочим код согласно вашему требованию прилагаются ниже:

Controller 
--------- 
(function() { 
       'use strict'; 

    angular 
     .module('app', []) 
     .controller('ParentController', ParentController); 

    ParentController.$inject = ['$scope']; 

    function ParentController($scope) { 
     var vm = this; 
     console.log(this); 
     vm.test = {}; 
     vm.test.label = "This is being set in the parent controller."; 
    } 
})(); 

(function() { 
    'use strict'; 

    angular 
     .module('app') 
     .controller('ChildController', ChildController); 

    ChildController.$inject = ['$scope']; 

    function ChildController($scope) { 
     var childVm = this; 
     childVm.test = $scope.vm.test; 
    } 
})(); 


HTML 
--- 

<div ng-app="app"> 
      <div ng-controller="ParentController as vm"> 
       <div>PARENT: {{vm.test.label}}</div> 
       <div ng-controller="ChildController as childVm"> 
        <div>CHILD: {{childVm.test.label}}</div> 
       </div> 
      </div> 
     </div> 

Приветствие !

+0

Спасибо за подробный ответ, я очень ценю помощь. Так что, я думаю, у меня просто нет большого понимания «var vm = this;» и как это сравнивается с «$ scope» ... Я просто обновил свой пост, чтобы указать, что мне нужно соблюдать руководство стиля John Papa , и против этого руководства использовать '$ scope' таким образом. Что я могу сделать, чтобы обойти использование '$ scope.vm' в моем дочернем контроллере? Еще раз спасибо! – Spencer

+0

Только что пересмотренный [plunkr] (https://plnkr.co/edit/dOCpXXq1c5wxiJ2xZyYT?p=preview) от комментатора выше, надеюсь, это лучше продемонстрирует мою путаницу: – Spencer

+0

Кажется, вы неправильно поняли, что пытается сказать Джон Папа. Он говорит, что если у вас есть отношение родительского и дочернего контроллера, вместо прямого использования $ scope, мы должны использовать синтаксис «controller as». Благодаря этому мы можем изолировать свойства родителя и ребенка и избегать конфликтов. Продолжение ... –

1

После проверки plnkr, надеюсь, что я был в состоянии понять ваш вопрос, и дает ответ на его основе:

В файле контроллера, для ChildController

var childCtrl = this; 

// Why don't either of these work? 
// childCtrl.test = parentCtrl.test; 
// childCtrl.test = this.parentCtrl.test; 
  • назначая parentCtrl.test, Безразлично 't имеет смысл, так как он является объектом родительского контроллера.
  • this.parentCtrl.test будет оцениваться как childCtrl.parentCtrl.test, который является недопустимым.

Вслед работал because-

// But this does... 
childCtrl.test = $scope.parentCtrl.test; 

Во время выполнения кода

  • Две отдельные области будут получать каждый созданный для ParentController и ChildController.

  • ребенок наследует свойства родителя, те, которые отсутствуют в childController, и будут назначены области childController. Благодаря которому вы можете получить доступ к значению у ребенка с областью действия.

+0

Спасибо за дополнительную информацию, все, что вы сказали, встроено в плакат I обсуждал это в субботу. Я ценю вашу помощь и время! – Spencer

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