У меня возникли проблемы с пониманием наследования областей, и я изо всех сил старался передавать объекты данных из родительского контроллера в дочерний контроллер, но я не могу заставить работать. Может кто-нибудь объяснить, почему это не работает? Спасибо!
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:
Проблема: 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>
Ура!
var vm = this;
и как это сравнивается с $scope
... Я только что обновил свой пост, чтобы указать, что мне нужно соблюдать руководство по стилю Джона Папа, и это противоречит этому руководству, чтобы использовать $scope
таким образом. Что я могу сделать, чтобы использовать $scope.vm
в моем дочернем контроллере? Еще раз спасибо!
После проверки plnkr, надеюсь, я смог понять ваш вопрос и дать ответ на его основе:
В файле контроллера для ChildController
var childCtrl = this;
// Why don't either of these work?
// childCtrl.test = parentCtrl.test;
// childCtrl.test = this.parentCtrl.test;
После работы because-
// But this does...
childCtrl.test = $scope.parentCtrl.test;
Во время выполнения кода
Две отдельные области будут создаваться каждый для ParentController и ChildController.
child наследует свойства родителя, те, которые отсутствуют в childController, и будут назначены для области childController. Благодаря чему вы можете получить доступ к значению в дочернем сфера.