2014-03-30 5 views
5

Ich habe eine einfache Frage nach dem Lesen der Post unten und arbeiten seit einiger Zeit auf eckigen js.Modellobjekte in Controllern ändern, um DOM zu manipulieren - eckige js - Best Practices?

der Beitrag: no dom manipulation from angular js controllers

der betreffende Punkt (von der Post): -Controller verwenden Sie nicht zu
DOM manipuliere - Controller sollten nur Geschäftslogik enthalten. Wenn Sie eine Präsentationslogik in Controller einfügen, wirkt sich dies erheblich auf die Testbarkeit aus. Angular verfügt für die meisten Fälle und Direktiven über Databinding, um manuelle DOM-Manipulation einzukapseln.


die Frage: Wenn ich einen einfachen Winkel App habe und auf einer Schaltfläche klicken i eine Funktion von meinem Controller nennt. In dieser Funktion möchte ich eine einfache Geschäftslogik machen und abhängig von dieser Geschäftslogikausgabe möchte ich eine Schaltfläche verbergen/anzeigen.

Was ist der beste Weg, es zu tun.

Meine heutige Art und Weise, dies zu tun ist: PLUNKER EXAMPLE (nicht so Sachen zu tun, das Gesetz in der Winkel js Reich bricht, ist, dass gegen Tests bitte korrigieren Sie mich.?)

+0

Was Sie tun, ist in Ordnung. Sie möchten Code wie 'if ($ scope.isAdmin) $ ('# password'). Show();' in Ihrem Controller vermeiden. – dave

+0

Ich würde die Reset-Button-Logik in eine Funktion im Bereich der Steuerung verschieben, um es einfacher zu testen, wie Sie mit checkLoginName haben. Sonst sieht es gut aus. – tasseKATT

+0

Danke, aber würde das nicht reduzieren Lesbarkeit wie jquery.i bedeuten, dass einige Funktion aufgerufen wird und einige Modell ändert sich (was unvermeidlich ist) und dann plötzlich einige Div/Schaltfläche verschwindet. Ich meine, ich bin völlig in Ordnung mit der Art, wie ich es getan habe und diese Zweifel vergessen – ankur

Antwort

8

Die Angular Richtlinien don‘ Ich sage "benutze keine Controller, um das Dom zu manipulieren" in dem Sinne, dass du niemals die Dom-Änderung als Ergebnis von etwas in einem Controller haben solltest - sondern dass du niemals in einem Controller das Dom direkt ändern solltest. Benutze document.getElementById nicht, benutze $ ("# element"), etc. - rede niemals mit dem dom, lass dein Modell das übernehmen, indem du das Modell an das dom bindest.

Wenn Sie sich in einer Situation befinden, in der Sie jQuery verwenden möchten, um mit dem dom direkt in einem Controller zu sprechen, ist es an der Zeit, Direktiven anzusehen. http://docs.angularjs.org/guide/directive

Und ich stimme mit @tasseKATT überein, verschiebe den ng-click-Code auf dem Reset-Button-Code in eine Funktion - auch wenn nur aus Gründen der Vernunft.

bearbeiten

Ist dieses prüfbar? Ja - viel mehr als Dinge in HTML zu integrieren oder direkt auf das DOM zu setzen.

In dieser Situation müssen Sie nur testen, dass Ihre Scope-Funktionen tun, was sie sollen - und darauf vertrauen, dass die Angular-Leute bereits die Tatsache getestet haben, dass ihre Bindungen wie dokumentiert funktionieren. Sie müssen nicht testen, dass ng-click Ihre Funktion aufruft. Sie müssen testen, ob sie mit den Parametern aufgerufen wird, die Ihre Funktion erfüllt.

Soweit es einfacher ist, diese Art von Code inline oder in document.ready usw. schreiben - das ist nur ein Teil der Gewöhnung an die Angular Art, Dinge zu tun. Aufgrund jahrelanger Bindung mit jQuery ist es sicherlich etwas gewöhnungsbedürftig. Ich würde argumentieren, dass es schwieriger ist, es auf die "alte" Art und Weise zu tun.

Überprüfen Sie die Beiträge auf dieser Website, die sich mit dem Testen von Angular befassen - es gibt Aufstellungen über das Testen von Controllern, Richtlinien, Diensten usw. - wirklich geholfen, alles für mich zusammen zu setzen. http://www.benlesh.com/2013/05/angularjs-unit-testing-controllers.html

+0

Okay, ich habe den Punkt ... ein paar Fragen .. 1. diese Möglichkeit, Ihr Modell zu ändern und es durch ng-Shows/ng-Häute reflektiert/toggles - ist das "TESTABLE" oder "NOT" (weil ich befürchte, es würde ein Punkt kommen, an dem diese "Funktionen" aufgerufen würden, die wiederum einige Funktionen aufrufen würden, die dazu führen würden, dass ein dom-Element angezeigt/versteckt wird - bitte hinweis: meine angst ist nicht das ergebnis, sondern die testfähigkeit) ..... 2. ich finde es einfach, diese inline zu schreiben, da dies die lesbarkeit im vergleich zu einer bewegung zu einer funktion erhöht .. WOLLEN ich diese praxis ändern? – ankur