Назначение $ element и $ attrs в контроллерах компонентов с компонентами angularJS 1.5
Я работаю над тем, чтобы ускорить работу с 1.5 angular компонентами. Я слежу за видеороликами todd Motto, чтобы начать работу с компонентами вместе с документацией angular https://docs.angularjs.org/guide/component.
На данный момент кажется, что компоненты заменяют директивы, которые используют контроллеры, но в нашем 1.5-коде мы по-прежнему будем использовать директивы для манипуляции с dom.
Какова цель $element, $attrs внутри компонентного контроллера? Кажется, они доступны для манипуляций. Вот ссылка на плункер с документами. Я знаю, что они не используют $element, но это пример, который я читаю. http://plnkr.co/edit/Ycjh1mb2IUuUAK4arUxe?p=preview
Но в коде вроде так...
angular
.module('app', [])
.component('parentComponent', {
transclude: true,
template: `
<div ng-transclude></div>
`,
controller: function () {
this.foo = function () {
return 'Foo from parent!';
};
this.statement = function() {
return "Little comes from this code";
}
}
})
.component('childComponent', {
require: {
parent: '^parentComponent'
},
controller: function () {
this.$onInit = function () {
this.state = this.parent.foo();
this.notice = this.parent.statement();
};
},
template: `
<div>
Component! {{ $ctrl.state }}
More component {{$ctrl.notice}}
</div>
`
})
Каким будет использование $element, если мы не будем манипулировать dom?
Ответы
Ответ 1
Это отличный вопрос. И у меня есть простой ответ на это.
Они имеют место в компонентах только потому, что компонент является синтаксическим сахаром вокруг директивы.
До того, как angular добавил Components, я использовал какой-то компонентный синтаксис для директив, это было похоже на соглашение, что в нашем проекте у нас есть два вида директив, одна отвечает за манипуляции с DOM, вторая - это директивы с шаблонами, которые не должны манипулировать DOM. После добавления компонентов мы не более чем изменили имена.
Таким образом, Component
- это не более чем простая директива, которая была создана как новая сущность, которая:
- Всегда есть шаблон
- Сфера всегда изолирована
- Ограничить всегда элемент
Я думаю, что вы можете найти еще больше ответов в угловых источниках, но я советую вам не смешивать эти сущности, и в случае, если вам нужно манипулировать DOM внутри вашего компонента, просто используйте директиву внутри.
Ответ 2
Angular крючки жизненного цикла компонентов позволяют нам выполнять манипуляции с DOM внутри контроллера компонента с помощью службы $element
var myApp = angular.module('myApp');
myApp.controller('mySelectionCtrl', ['$scope','$element', MySelectionCtrl]);
myApp.component('mySection', {
controller: 'mySelectionCtrl',
controllerAs: 'vm',
templateUrl:'./component/view/section.html',
transclude : true
});
function MySelectionCtrl($scope, $element) {
this.$postLink = function () {
//add event listener to an element
$element.on('click', cb);
$element.on('keypress', cb);
//also we can apply jqLite dom manipulation operation on element
angular.forEach($element.find('div'), function(elem){console.log(elem)})
};
function cb(event) {
console.log('Call back fn',event.target);
}
}
объявить компонент в html
<my-section>
<div class="div1">
div 1
<div>
div 1.1
</div>
</div>
<div class="div2">
div 1
</div>
частичный шаблон компонента (./component/view/section.html)
<div>
<div class="section-class1">
div section 1
<div>
div section 1.1
</div>
</div>
<div class="section-class1">
div section 1
</div>