Дочерний контроллер не наследуется от родительского контроллера

0

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

EDIT: Я не указывал это раньше, но это требование к проекту использовать руководство стиля John Papa, поэтому я не могу решить эту проблему, используя $scope в любом из контроллеров.

ОБНОВЛЕНИЕ: Кажется, я неправильно понял цель использования this... основанный на помощи плакатов ниже, теперь я понимаю, что определенные действия требуют использования $scope а руководство по стилю John Papa просто просит разработчиков использовать this когда 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
    У вас должен быть только один модуль, почему вы объявляете два модуля?
  • 1
    Проверьте этот plunkr, plnkr.co/edit/bs9Zaba0yW8lqlStoe7Z?p=preview
Показать ещё 3 комментария
Теги:
angularjs-scope

2 ответа

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

Проблема: vm также является частью самого объема $. Таким образом, вы не можете использовать этот экземпляр для контроллера Parent & Child. В противном случае вы столкнетесь с проблемами при их использовании. Если вы хотите изолировать этот экземпляр для родительского и дочернего, введите другие имена. Поскольку vm также является частью контроллера, поэтому, если вы хотите получить доступ к Parent vm внутри $scope.vm контроллера, вам придется делать $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 ... Я только что обновил свой пост, чтобы указать, что мне нужно соблюдать руководство по стилю Джона Папа, и это противоречит этому руководству, чтобы использовать $scope таким образом. Что я могу сделать, чтобы использовать $scope.vm в моем дочернем контроллере? Еще раз спасибо!
  • 0
    Только что пересмотрел plunkr из комментария выше, надеюсь, это лучше продемонстрирует мою путаницу:
Показать ещё 2 комментария
1

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

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

var childCtrl = this;

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

После работы because-

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

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

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

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

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

Ещё вопросы

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