jQuery Plugins funktioniert nicht gut mit Angularjs

8

Ich habe jQuery Slider in meinem Projekt verwendet, in dem ich Bilder mit eckigen geladen habe. Meine aktuelle Ansicht sieht folgendermaßen aus:

%Vor%

der Controller;

%Vor%

Und der jQuery Slider Code (um es zu einem Slider zu machen. Ich benutze dieses Plugin Ссылка )

%Vor%

Wenn ich diesen Code ausprobiere, werden alle Bilder aus der Datenbank geladen (debuggt über Firebug) aber der jQuery-Slider wendet die Animation oder den Gleiteffekt nicht darauf an
Und wenn ich die data-ng-repeat="image in gallery entfernen und einige statische Inhalte verwenden, d. H. Bilder, bekomme ich den Schiebereffekt zurück.
Was ist das Problem hier. Ich denke, Angular manipuliert etwas wie mein DOM. Deshalb bekomme ich dieses Problem, wenn ich setze, d. H. Einige Winkelattribute auf meinem Schieberegler verwenden.
Hinweis: Ich habe das gleiche Problem mit jQuery-News, also jQuery InnerFade plugin Ссылка
Hier ist, wie die innerFade verwendet wird;

%Vor%

und der Controller;

%Vor%

Wie behebe ich diese Probleme?
Update 2: Hier sind meine Routen;

%Vor%

Lösung # 1: Temporär, (wie @Jason Goemaat beantwortet) funktioniert für mich. Also, hier ist was ich getan habe. Ich habe kein directive erstellt, aber direkt habe ich meinem Controller $timeout injiziert und dann folgendes gemacht:

%Vor%

Und es hat für beide funktioniert, d. h. für Slider und für InnerFade

    
DotNet Dreamer 03.06.2013, 14:58
quelle

5 Antworten

6

Angular IS manipuliert Ihr dom, die ng-repeat-Direktive erstellt die Elemente, wenn es eine Liste gibt, von der aus gearbeitet werden kann. Aus diesem Grund müssen Sie .slides aufrufen, nachdem eckling die Elemente erstellt hat, da das Plugin das DOM selbst verändert.

Hier ist eine Anweisung, die Sie verwenden können, um $.slides für ein Element aufzurufen, das darauf basiert, wann ein Array die Länge & gt; 0. Es zeigt zusätzliche Attribute wie 'Start' an, um den Aufruf von Folien zu modifizieren. Hier prüft es ein Array in Ihrem $ scope namens 'images' und ruft $timeout() während der Link-Phase auf, um .slidesjs() aufzurufen, wenn eckig mit dem Erstellen des DOMs fertig ist. Ich wusste nicht, welches Plugin du benutzt hast, also habe ich ein slidesjs gefunden, das ähnlich aussah. "Hier ist ein Plünderer: Zypern

Html:

%Vor%

Richtlinie:

%Vor%

Beachten Sie, dass es immer noch nur einmal aufgerufen werden kann. Wenn Ihre Bilderliste aktualisiert wird, funktioniert das nicht. Dazu könnten Sie den Inhalt in der Direktive erstellen ...

    
Jason Goemaat 09.06.2013, 07:00
quelle
9
%Vor%

wird ausgelöst, bevor eckig den Inhalt auf die Seite geladen hat. Das jQuery-Slider-Skript sollte erst aktiviert werden, nachdem eckal den Inhalt geladen hat. Ein Teil des Problems besteht darin, dass angular keinen Rückruf für $digest bietet, so dass Sie nicht auf ein Ereignis warten müssen.

Der Inhalt wird geladen - & gt; Ereignisrückruf - & gt; UI bauen, während in jQuery und Standard-Javascript-Denken üblich ist, ist es nicht Teil der eckigen Mentalität. Zum Glück hat eckig eine wahnsinnig leistungsfähige Methode, um dieses Problem zu lösen.

Sie müssen das Skript jQuery slideshow in eine eckige Anweisung umwandeln. Dann wird es Teil des eckigen Prozessraums und wird als Teil des eckigen Digest-Zyklus instanziiert.

Etwas wie

%Vor%

Viel Glück!

Happy Beispiel Zeit mit innerfade (Ich habe dies noch nicht getestet, wird so schnell wie möglich). Zuerst muss Ihre Anwendung ein eckiges Modul deklarieren, falls dies noch nicht geschehen ist. %Code%. Ссылка

(stellen Sie sicher, dass Ihr Controller ebenfalls angeschlossen ist!)

Jetzt können Sie eine Direktive für dieses Modul deklarieren. Was ist super cool.

%Vor%

Die Funktionsweise ist ziemlich einfach. Die Funktion ng-app="myModule" überwacht den Teil des Bereichs, der Ihre Daten enthält. Wenn sich das ändert (einschließlich der Initialisierung), wird die Funktion $watch jQuery für innerfade mit der Anweisung ausgelöst. Wir übergeben auch "C" an das restricte-Argument, so dass diese benutzerdefinierte Direktive eine Nur-Klassen-Direktive sein wird (ich habe bemerkt, dass dir das anscheinend gefällt).

%Vor%

Jetzt müssen Sie nur die Daten an element in Ihrem Controller binden (binden Sie es so, wie Sie möchten, einschließlich Ajax), und es wird einfach funktionieren. Sie können sogar die Daten in $scope.innerData ändern und es wird mit vollem jQuery Ruhm aktualisiert.

    
Fresheyeball 03.06.2013 15:12
quelle
1

Ein paar Gedanken
1) Meine Vermutung ist, dass mit Ihrer Haupt-App-Seite etwas nicht stimmt. Haben Sie jQuery nach angularjs? Ich nehme an, Sie verwenden die ng-repeat-Anweisung?

2) Ändern Sie $ in jQuery

3) Platzieren Sie document.ready Skript auf der Hauptseite ... und überlegen Sie auch, es durch

zu ersetzen %Vor%

Ich bin sicher, dass ich debuggen kann, wenn Sie Code für die Hauptseite sowie die Ansicht zeigen können.

    
ddeloy 09.06.2013 06:29
quelle
1

Fügen Sie eine Anweisung zu #slides

hinzu %Vor%     
David Nguyen 09.06.2013 07:50
quelle
1

wie gesagt: "Das jQuery-Slider-Skript sollte erst aktiviert werden, nachdem eckal den Inhalt geladen hat" So können Sie warten, bevor es geladen wird, und dann wird Ihr jQuery-Code ausgeführt.

%Vor%     
Marian 18.09.2015 22:09
quelle

Tags und Links