Angular-styleguide: .Komponenten-Helfer

Erstellt am 11. Feb. 2016  ·  5Kommentare  ·  Quelle: johnpapa/angular-styleguide

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

Angular 1

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

Alle 5 Kommentare

(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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

yosiasz picture yosiasz  ·  7Kommentare

sgbeal picture sgbeal  ·  7Kommentare

robrothedev picture robrothedev  ·  6Kommentare

jusefb picture jusefb  ·  9Kommentare

annabellor picture annabellor  ·  9Kommentare