AngularJS - Controller in meinem teilweise

Habe ich eine Vorlage, die appendend viele Male in meinem DOM.

<div ng-controller="theController">
    content does not matter
</div>

Also der controller ist istantiated viele Male.
Dies ist ein problem, denn wenn ich einen Wächter im controller

theController = function($scope) {
    $scope.$on('myVar', function() {
        //run one time for each time the template is repeated
    })
}

Irgendwelche Ideen, wie man diese vermeiden?
Vielen Dank im Voraus.

UPDATE

OK, ich werde versuchen, klarer zu werden.

Vielleicht habe ich ein Formular, dass dynamisch erstellt auf der Grundlage der Antwort auf eine asynchrone Anforderung.

<form ng-controller="formController">
    <div ng-repeat="f in fields">
        <ng-inclide src="f.fields"></ng-include>
    </div>
</form>

Der controller ist so etwas wie:

function formController($scope) {
    $scope.fields = [{ template:'', ... }];
    //data come from an ajax request... 
    //here are static for the sake of simplicity.
}

So, ich weiß nicht, welche Felder angefügt werden, in der form.

Den Formular-Feld-Struktur gespeichert in html partials... so etwas wie:

<div ng-controller="inputController">
    <label> .... </label>
    <input type="text" .... />
</div>

oder

<div ng-controller="selectController">
    <label> .... </label>
    <select>
        ....
    </select>
</div>

function selectController($scope){
    $scope.$on("myCustomEvent", function(event) {
        cionsole.info("Options were updated");
    });
}

Wenn das Formular verfügt über eine mehr als input type=text oder eine select, die inputController oder die selectController sind instanziert, mehr als einmal.

Warum wollen Sie nicht die $Uhr auftreten, für jede Instanz?

Möchte ich zum aktualisieren der Optionen eines selects in die Seite, wenn ein bestimmtes Ereignis Eintritt.

Was ich bekomme, anstatt dass ich ein update für alle die wählen Sie in der Seite.

Aus dem Kommentar, ich habe verstanden, dass falsch ist, müssen mehr Elemente mit dem gleichen controller auf der gleichen Seite.
So derzeit die einzige verfügbare Lösung scheint mir, dass ist zu vermeiden, definieren Sie einen controller für jedes element des Formulars, richtig?

UPDATE 2

$emit wird in der inputController:

function inputController() {
    $scope.fireclick = function(p) {
        if (p == 'specificInput') {
            /* this is a temporary work around 
            I used to bind the event only with a specific field */

            $scope.$emit("myCustomEvent");      
        }
    }
}

Dies ist der vollständige code des input-Feld in der html-partial:

<input type="text" ng-click="fireclick(f.name);" name="{{f.name}}" />

@Jemand:

Konnte zumindest bestätigen, (und schließlich sagen, warum), haben auf der gleichen Seite mehrere Elemente mit dem gleichen controller ist falsch

  • Controller-Instanzen kann nicht (und sollte nicht) werden gemeinsam von mehreren Elementen. Was sind Sie versuchen zu tun und warum wollen Sie nicht die $watch auftreten, für jede Instanz? Controller sind von Natur aus lokalen, wo Sie sind mit Ihnen in den DOM - Sie sind nicht in der gesamten Anwendung - so dass, wenn die $watch mehrfach ausgelöst, ist eine Frage, die du wahrscheinlich etwas falsch zu machen.
  • ist die Veranstaltung zu einem boradcast/emittieren
  • Ich verwendete $rootScope.$emit('myCustomEvent')
  • wer ist das abfeuern dieser Veranstaltung ist es, innerhalb der form, oder von irgendwo elese
  • Kannst du die Codes, die Entlassung der Veranstaltung
  • Ich aktualisierte die Frage...
  • konnte zumindest bestätigen, dass mehr als ein element mit dem gleichen controller ist falsch?
  • Nein, es sollte kein problem sein
  • In Ihrer Verwendung das problem scheint zu sein, die Sie nicht definiert haben, Zielgruppe der Veranstaltung, die Sie aussenden der Veranstaltung von der Wurzel Geltungsbereich für alle Kinder
  • Wie könnte man definieren das Ereignis ausgelöst, wenn das Eingangssignal x hat habhaft werden, nur wählen Sie y
  • So, vielleicht wissen Sie auch, wie könnte ich das Problem lösen?

InformationsquelleAutor Bruno | 2013-04-08
Schreibe einen Kommentar