Mit der Veröffentlichung von Angular 1.5 können wir die Verknüpfung .component() verwenden, um Komponentendirektiven zu erstellen.
Haben Sie Vorschläge zur Verwendung?
Ich bin seit einiger Zeit ein großer Anhänger Ihres Styleguides und so schreibe ich ihn normalerweise.
Kleine, ohne dass ein Controller benötigt wird, schreibe ich das Template gerne in dieselbe Datei wie den Rückgabewert einer hochgezogenen Funktion
(function() {
'use strict';
var componentConfig = {
template: generateTemplate(),
bindings: {
kpiVal: '=',
kpiLabel: '=',
},
};
angular
.module('app.utils.kpi')
.component('sfKpi', componentConfig);
//
function generateTemplate() {
return [
'<div class="sf_kpi">',
' <div class="sf_kpi__number">{{ $ctrl.kpiVal }}</div>',
' <div class="sf_kpi__label">{{ $ctrl.kpiLabel }}</div>',
'</div>',
].join('');
}
}());
Für Fortgeschrittene lege ich die Vorlage gerne in eine separate Datei und verwende die Eigenschaft 'templateUrl'.
(function() {
'use strict';
var componentConfig = {
templateUrl: 'components/active-places/active-places.widget.html',
controller: controller,
};
angular
.module('app.widget.activeplaces')
.component('activePlaces', componentConfig);
/* <strong i="12">@ngInject</strong> */
function controller($log, activityService) {
var vm = this;
vm.activities = [];
vm.isLoading = true;
vm.doFunnyStuff = doFunnyStuff;
activate();
function activate() {
$log.info('👊 activating activePlaces component');
activityService.getActivites()
.then(fetchData)
.catch(handleError)
.finally(stopLoader);
//
function fetchData(activities) {
vm.activities = activities;
$log.log('👓 activePlaces activities fetched: ', activities);
}
function handleError(err){
$log.error('💥 problem fetching activePlaces data', err);
}
function stopLoader() {
vm.isLoading = false;
$log.info('💪 activePlaces component started');
}
}
// methods
function doFunnyStuff() {
vm.activities.push('yolo');
}
}
}());
Ich bin auch neugierig auf Ihre Meinung zum $onInit-Hook und wie sollten Ihrer Meinung nach Komponenten getestet werden.
Vielen Dank
(function() {
'use strict';
var componentConfig = {
bindings: {
data: '<'
},
templateUrl: 'components/active-places/active-places.widget.html',
controller: 'ActivePlacesController as vm',
};
angular
.module('app.widget.activeplaces')
.component('activePlaces', componentConfig)
.controller('ActivePlacesController', ActivePlacesController);
/* <strong i="5">@ngInject</strong> */
function ActivePlacesController($log, activityService) {
var vm = this;
vm.activities = [];
vm.isLoading = true;
vm.doFunnyStuff = doFunnyStuff;
// methods
function doFunnyStuff() {
vm.activities.push('yolo');
}
}
}());
Auf diese Weise kann der Controller getestet werden.
Ich persönlich bevorzuge diesen Weg.
(function() {
'use strict';
angular
.module('app.widget.activeplaces')
.component('activePlaces', {
bindings: {
data: '<'
},
templateUrl: 'components/active-places/active-places.widget.html',
controller: 'ActivePlacesController as vm',
})
.controller('ActivePlacesController', ActivePlacesController);
function ActivePlacesController($log, activityService) {
var vm = this;
vm.activities = [];
vm.isLoading = true;
vm.doFunnyStuff = doFunnyStuff;
// methods
function doFunnyStuff() {
vm.activities.push('yolo');
}
}
}());
Auf diese Weise kann der Controller getestet werden.
@softsimon : v1.5.0
führt ngMock#$componentController ein , sodass Sie den Controller aus Gründen der Testbarkeit nicht separat registrieren müssen :smiley:
Ich kann zweitrangig, thx @gkalpak . @softsimon Sie können diese Zeile einfach von oben überspringen:
.controller('ActivePlacesController', ActivePlacesController);
Ich bin auch großer Fan dieses Styleguides.
@xavhan für $onInit
würde ich in deinem Beispiel so verwenden:
vm.$onInit = activate;
function activate() {
}
Ich könnte es init
und ab v1.5.0 nicht aktivieren.
Ich bin auch gespannt, was @johnpapa dazu sagt , schätze
:+1: für
vm.$onInit = activate;
function activate() {
}
geschlossen für #766, um der Ort für Komponentendiskussionen zu sein
Hilfreichster Kommentar
Ich kann zweitrangig, thx @gkalpak . @softsimon Sie können diese Zeile einfach von oben überspringen:
.controller('ActivePlacesController', ActivePlacesController);
Ich bin auch großer Fan dieses Styleguides.
@xavhan für
$onInit
würde ich in deinem Beispiel so verwenden:vm.$onInit = activate;
function activate() {
}
Ich könnte es
init
und ab v1.5.0 nicht aktivieren.Ich bin auch gespannt, was @johnpapa dazu sagt , schätze