6

Ich benutze Bootstrap UI in meiner eckigen Anwendung. Ich habe einen Tooltip in der HTML-Seite, die gut funktioniert. Mir ist aufgefallen, dass nachdem die QuickInfo angezeigt wird und ich meine Maus raus bewege, die Methode UI-bootstrap-tpls.js eine Methode namens "hideTooltipBind" auslöst, die wiederum $ apply aufruft und die Filter in diesem Bereich neu lädt.Bootstrap ui angularjs mit Filterproblem

Sagen wir, ich habe 10 Filter im Bereich, die ein Array von jeweils 100 filtern. Jedes Mal, wenn ein Tooltip angezeigt wird, müssen alle meine Filter erneut geladen werden. Wie kann ich das vermeiden? Ich bin mit

//ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js 
jquery-2.0.3.js 
ui-bootstrap-tpls-0.11.0.js 

ich den Screenshot des Call Stack

enter image description here

+1

Die Tooltip-Anweisung erstellt tatsächlich einen [separaten Bereich] (https://github.com/angular-ui/bootstrap/blob/master/src/tooltip/tooltip.js#L110) für den Tooltip. Sind Sie sicher, dass es * Ihren gesamten Umfang verdaut? –

+0

Ja, es löst alle Uhren aus und filtert die Neubewertung. – Gokul

+5

Dies ist die Antwort, die ich vom Bootstrap-UI-Team erhalten habe "So funktioniert AngularJS - jeder Aufruf von $ scope. $ Apply löst alle Uhren aus und filtert die Neubewertung. Das hat nichts mit Tooltips zu tun - Sie werden das Gleiche sehen Verhalten, wenn Sie beispielsweise Text in ein Eingabefeld eingeben. " – Gokul

Antwort

0

Sie können irgendeine Form von Einmal Bindung angebracht haben nutzen. Es gibt mehrere Möglichkeiten gibt:

Es gibt einige Unterschiede zu den vier (unabhängig von Ihrer Frage jedoch):

  • Bindung-einmal ist die beliebteste, die aktivste Entwicklung zu sehen. Benötigt zwei Direktiven, um die Aufgabe zu erledigen (bindonce und bo-*).
  • Winkel einmal ist die minimalistisch die vier (zitieren Sie mich nicht auf dem).
  • watch-Kämpfer nicht versprechen basierte Daten verarbeiten.
  • schnell bind hat ein Anmelder System für halbstatischen Bindungen, in dem Ereignis Angular-Bus.

Angenommen, Sie würden beginnen entweder einer von ihnen nutzen könnte Ihre Bindungen wie folgt aussehen:

<div bindonce="someData"> 
    <span bo-bind="someData.text | yourFilter"></span> 
</div> 

<span once-text="someData.text | yourFilter"></span> 

<span set-text="someData.text | yourFilter"></span> 

<span bind-once="someData.text | yourFilter"></span> 

Auf diese Weise würden Ihre Filter bei Winkelaufrufen an $digest nicht erneut ausgewertet. Wenn Sie eine Sammlung in Ihrer Ansicht filtern (<li ng-repeat="coll | filter"></div>), würde ich vorschlagen, dass Sie diese Filter auf den Controller verschieben, um die Anzahl der Aufrufe an die Filter selbst zu reduzieren.