Цель состоит в том, чтобы иметь две разные директивы, которые являются функциональными функциями совместного использования братьев и сестер. Я либо буду использовать один , либо другой, ни один внутри другой.Задачи определения наследования углового контроллера
Однако вторая директива будет иметь все возможности первой с небольшими дополнениями. Из-за этого мне хотелось бы, чтобы функциональность наследовала из директивы «Родитель» на «Ребенок».
Я достигаю этого путем повторного использования одного и того же объекта определения директивы из родителя на ребенка, за исключением полей контроллера/шаблона.
Все это хорошо работало, пока я не ударил наблюдателей с моего ParentDirCtrl
. По какой-то причине наблюдатель, кажется, настроен правильно, наблюдая mydir.obj1
, и все же как-то внутри функции обратного вызова наблюдателя mydir.obj1
становится неопределенным.
Я кой-что о _.extend
/$controller
меняется, как в $scope
сек работы так mydir.obj1
не определена в ParentDirCtrl
предположения, но я не знаю, почему это было бы дело.
angular.module('plunker', [])
// lodash
.constant('_', _)
.controller('MainCtrl', function($scope, $timeout) {
$scope.obj = {
name: 'John',
age: 30,
};
})
.controller('ParentDirCtrl', function($scope) {
var mydir = this;
mydir.doStuffInParent = function() {
alert('executed from the parent directive');
}
$scope.$watch('mydir.obj1', function() {
// ====================================
// ERROR
// Why is 'mydir.obj1' undefined when
// occupation is set?
// ====================================
mydir.obj1.occupation = 'Meteorologist';
});
})
.directive('parentDirective', parentDirective)
.directive('childDirective', function() {
// borrow the directive definition object from the parent directive
var parentDDO = parentDirective();
// uodate the template and controller for our new directive
parentDDO.template = [
'<div>',
'<p ng-click="mydir.doStuffInParent()">{{mydir.obj1.name}}</p>',
'<p ng-click="mydir.doStuffInChild()">{{mydir.obj1.age}}</p>',
'</div>'
].join('');
parentDDO.controller = function($scope, $controller, _) {
// extend 'this' with the Parent's controller
var mydir = _.extend(this, $controller('ParentDirCtrl', { $scope: $scope }));
mydir.doStuffInChild = function() {
alert("executed from the child directive");
};
};
return parentDDO;
});
// this will be moved to the top during declaration hoisting
function parentDirective() {
return {
restrict:'E',
scope: {},
bindToController: {
obj1: '=',
},
template: '<div>{{mydir.obj1}}</div>',
controller: 'ParentDirCtrl',
controllerAs: 'mydir',
};
}
Если они по существу одинаковы, почему вы не можете просто дифференцировать функциональность в одном, установив атрибут? – charlietfl
Ребенок будет иметь некоторые функции, которые перезаписывают родительский элемент, а затем набор функций просто не нужен родителям. Кроме того, у него будут наблюдатели за атрибутами, которых нет у родителя. Это означает, что в ребенке требуется 100% функциональности родителя. Для управления всем этим в одной директиве потребуется много условностей. – diplosaurus
'var mydir' - это' this' расширен с свойствами родительского контроллера. Я понимаю, что это способ унаследовать от другого контроллера. – diplosaurus