Hannes Weninger: Angular JS Directives -> Controller Methoden aufrufen

Hallo,

ich habe ein funktionierendes Beispiel (AngularJS Directive) erstellt, ich bin aber nicht sicher, ob mans so macht ober ob es einen besseren Weg gibt, das zu machen. Ich hab nämlich bei meinem bestehenden Beispiel (ohne Directive) ca 20 Functionen, welche ich dann in der Directive abbilden müsste und das erscheint mir ein bissche komisch. Hier mein Beispiel:

Mein Directiven- Beispiel

Wenn ich alle 20 Funktionsaufrufe abbilde, dann wird das eine ziemlich lange wurscht:

<my-customer customer="naomi" on-test="onTest()" on-my-test="onMyTest()" on...  on... on...></my-customer>

Bin euch dankbar für jeden Hinweis in diese Richtung! Danke! Hannes

  1. Tach!

    Ich hab nämlich bei meinem bestehenden Beispiel (ohne Directive) ca 20 Functionen, welche ich dann in der Directive abbilden müsste und das erscheint mir ein bissche komisch. Hier mein Beispiel:

    Ist es denn notwendig, dass diese Funktionen alle im Controller stehen? Das heißt, sind diese Funktionen nur für diesen einen Controller interessant und andere Controller definieren sich für diese Direktive eigene Funktionen?

    Die Alternative wäre, über einen Service (Angular-Stichwort: factory) nachzudenken. Den kann man auch der Direktive per Dependency Injection übergeben. Andererseits kann man einen solchen auch dem Controller injizieren, wenn es je nach Controller unterschiedliche Dinge sein sollen, und den über einen Direktiven-Parameter überreichen.

    dedlfix.

    1. Danke für deine Antwort!

      Es geht um eine Calendar- Directive. Ich habe aktuell in meinem Controller folgende Funktionen.

      vm.calendarMove = calendarMove; (von der aktuellen Woche eine Woche vor oder zurück - diese Funktion ruft eine Service funktion auf, welche über REST die Daten vom Backend holt)
      vm.calendarSwitch = calendarSwitch; (Switch zwischen Tag und Woche) 
      vm.getCalendarLabels = getCalendarLabels;
      vm.convertTimeInMinutes = convertTimeInMinutes; (zeit kann auch in einer Progressbar angezeigt werden - deshalb rechne ich 08:50 z.B. in Minuten um)
      vm.calculatePercentageOfDateTime = calculatePercentageOfDateTime;
      vm.getServiceScheduler = getServiceScheduler;
      vm.viewWeekOfCurrentDate = viewWeekOfCurrentDate;
      vm.viewCurrentWeek = viewCurrentWeek;
      vm.calculateChartViewTimeRanges = calculateChartViewTimeRanges;
      

      Den aktuellen Kalender, den ich Programmiert habe, zeit Anwesenheitszeiten an (Arbeitszeiten, Nachtdienste). Ich möchte aber auch einen "Abwesenheitskalender" haben für Urlaub, Krankenstände usw.

      Deshalb war meine Idee, dass ich eine Directive mache, einen Type setze (PRESENCE, ABSENCE, ALL) und dann wird der Kalender mit den jeweiligen Terminen angezeigt. Das wär mal die Theorie, ob ich das so hin bringe, ist die andere Frage - und da bin ich momentan eben am schaun.

      Was sagst du dazu, macht das Sinn? Bin dankbar für jeden Hinweis.

      Danke! Hannes

      1. Tach!

        Es geht um eine Calendar- Directive. Ich habe aktuell in meinem Controller folgende Funktionen.

        Der Controller verwaltet also den Kalender? Eigentlich ist das gar nicht sein Aufgabengebiet. Er soll nur die Schnittstelle zwischen Bediener und Model/Geschäftslogik sein. Die Verwaltung des Kalenders selbst würde ich auslagern. Das kann ein Service sein, aber auch ein einfaches Javascript-Objekt mit Methoden für die anzusprechende Logik.

        Der aktuellen Kalender, den ich Programmiert habe, zeit Anwesenheitszeiten an (Arbeitszeiten, Nachtdienste). Ich möchte aber auch einen "Abwesenheitskalender" haben für Urlaub, Krankenstände usw.

        Sind die Funktionen des Kalenders je nach Typ unterschiedlich? Wenn nicht, weißt du ja, was das Kalender-Objekt oder der Kalender-Service für Methoden hat und die kann die Direktive direkt selbst ansprechen. Das muss nicht über den Controller angebunden werden.

        dedlfix.

        1. Es wird dann aber eine rießige Direktive. Die Methoden sind für beide KalenderEinträge gleich - Ich werds mal versuchen zu refaktoren

          Danke! Hannes

          1. Tach!

            Es wird dann aber eine rießige Direktive. Die Methoden sind für beide KalenderEinträge gleich - Ich werds mal versuchen zu refaktoren

            Aber bitte nicht die Kalenderfunktionalität in die Direktive verlagern. Die Direktive soll die Bedienung managen, nicht den Kalender.

            Wenn irgendwas riesig wird, ist das ein Anzeichen, dass man zu wenig spezialisiert hat. Zum Beispiel nehm ich mal die Funktionalität, dass vom Kalender nur ein bestimmter Ausschnitt angezeigt wird. Wer verwaltet denn das? Der Kalender selbst nicht. Der verwaltet seine Einträge zu den Daten. Der Ausschnitt ist eine Ansicht des Kalenders, also eine View (allgemeiner betrachtet, nichts Angular-spezifisches). Die Parameter zum Ausschnitt, erstes Datum, letztes Datum, hervorgehobene Woche, Beschriftungen, verwaltet diese View. Wenn du zur nächsten Seite schaltest, berechnet die View die neuen Parameter und holt die dafür relevanten Daten aus dem Kalender. Schon hast du aus einem großen Monster zwei weniger große gemacht. Und dann kannst du weiterschauen, welche Funktionalitäten du noch wegdelegieren kannst, um mehr Trennung und Übersichtlichkeit ins Projekt zu bringen.

            dedlfix.