1.5 angular components。で速度を上げることに取り組んでいます。toddMottoのビデオに従って、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>
`
})
Domを操作しない場合、$ elementを使用するとどうなりますか?
それは素晴らしい質問です。簡単な答えがあります。
コンポーネントは構文シュガーディレクティブの周りにあるという理由だけで、コンポーネントで発生します。
angularコンポーネントを追加する前に、ディレクティブに何らかの種類のコンポーネント構文を使用していました。これは慣習のようなもので、プロジェクトでは2種類のディレクティブがあり、1つはDOM操作、 2番目は、DOMを操作してはならないテンプレートを使用したディレクティブです。コンポーネントを追加した後、名前を変更するだけでした。
したがって、Component
は、次の新しいエンティティとして作成された単純なディレクティブにすぎません。
angular sourcesでさらに答えを見つけることができると思いますが、これらのエンティティを混在させないでください。コンポーネント内でDOMを操作する必要がある場合は、内部でディレクティブを使用してください。
角度コンポーネントライフサイクルフックにより、$ elementサービスを使用してコンポーネントコントローラー内でDOM操作を行うことができます
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>