2017-06-22 3 views
0

Ich weiß, dass es bereits mehrere ähnliche Themen gibt, aber ich habe keine gefunden, die wirklich zu meinem Problem passen.Kontrollkästchen mit AngularJS basierend auf zwei Objekt-Arrays anzeigen

Beim Öffnen meiner AngularJS App/Website lade ich zwei Arrays von Objekten (beide vom selben Typ). Eine Liste enthält alle möglichen Werte (hier Quellen genannt) und die andere Liste ist eine Auswahl von Elementen aus der ersten.

Mein Ziel ist, alle Quellen als Kontrollkästchen anzuzeigen. Die aus der zweiten Liste müssen vorausgewählt werden, der Rest nicht. Jetzt kann der Benutzer Ankreuzfelder an-/abwählen. Wenn dies der Fall ist, muss ich den Server informieren (mit der source.id).

Was ich habe bisher:

exampleApp.controller('testController', [ '$scope', '$http', function($scope, $http) { 
     $scope.sources = []; 
     $scope.selectedSources = []; 
     $scope.changeSource = function(source) {...}; 
    }) 

und

<div ng-repeat="source in sources"> 
      <input 
        type="checkbox" 
        name="source.name" 
        value="{{source.id}}" 
        ng-model="??" 
        ng-change="changeSource(source.id)" 
      > {{source.name}} 
     </div> 

Was ich nicht herausfinden kann, ist, wie ich ng-Modell bekommen, die richtigen Kontrollkästchen vorzuwählen und wie das bekommen neue (und alte) Werte zu changeSource(). Gibt es eine elegante Art, das zu tun?

Beispiel (Pseudo-Code nur):

Sources = [{id=1, name=test1},{id=2, name=test2}, ...] 
SelectedSources = [{id=2, name=test2}] 

Nun, was ich brauche sind Kontrollkästchen wie folgt aus:

[ ] test1 [x] test2 

wo alle Elemente aus Quellen Kontrollkästchen und die, die von selectedsources sind vorausgewählt. Änderungen der Auswahl können in ausgewählten Quellen (als Objekte) gespeichert werden und müssen meine changeSource() -Funktion auslösen, damit ich meinen Server informieren kann.

+0

Der einfachste Weg, dies zu bewältigen, ist die Verwendung eines einzelnen Arrays mit einem zusätzlichen Feld für jedes Element, das dem ausgewählten Status entspricht. Ist das etwas, das in deiner Situation funktionieren würde? – Claies

Antwort

1

Setzen Sie den ausgewählten/nicht ausgewählten Zustand in einer Eigenschaft innerhalb jedes Objekts im Array Sources (initialisieren Sie ihn basierend auf dem, was in selectedArray vorhanden ist)

$scope.sources.forEach(function(source) { 
    source.selected = isSelected(source); 
    }) 

function isSelected(selectedSource) { 
    return !!$scope.selectedSources.find(function(s) { 
     return s === selectedSource || s.id == selectedSource.id; 
    }) 
    } 

Hier ist ein funktionierender Plotter link

+0

Am Ende schien dies die sauberste Antwort zu sein. Ich habe es ziemlich genau so umgesetzt. Vielen Dank und vielen Dank für all die anderen Antworten. – CodeO

0

Hi dies kann Ihnen helfen, neue & alten Wert zu bekommen.

$scope.$watch('sources', function (oldval, newval) { 
    console.log(oldval + newval); 
}); 
+0

Vielen Dank, aber die Werte im Quellen-Array sollten sich nicht wirklich ändern. Ich möchte nur Kontrollkästchen für jeden Artikel anzeigen. – CodeO

0

Ich habe Ihre Frage nicht sehr gut verstanden, aber wenn ich nicht irre, möchten Sie die zweite Sammlung mit den ausgewählten Elementen aus dem ersten nur füllen, nicht wahr? Wenn dies der Fall ist, könnten Sie Ihre zweite Sammlung in eine Rückkehr-Funktion mit einem Filter der ersten innen drehen, wie folgt:

In Ihrem Controller:

exampleApp.controller('testController', [ '$scope', '$http', function ($scope, $http) { 
    $scope.sources = []; 
    /* ... */ 
    $scope.getSelectedSources = function() { 
     return $scope.sources.filter(function (val) { 
      return val.selected; 
     }); 
    }; 
}) 

in Ihrer Vorlage:

<div ng-repeat="source in sources"> 
    <input 
      type="checkbox" 
      name="source.name" 
      value="{{source.id}}" 
      ng-model="source.selected" 
      ng-change="changeSource(source.id)" 
    > {{source.name}} 
</div> 

<div ng-repeat="source in getSelectedSources()"> 
    <input 
      type="checkbox" 
      name="source.name" 
      value="{{source.id}}" 
      ng-model="source.selected" 
      ng-change="changeSource(source.id)" 
    > {{source.name}} 
</div> 
+0

Danke. Was ich tun möchte, ist ein Kontrollkästchen für jedes Objekt im ersten Array anzuzeigen und jedes Kontrollkästchen zu aktivieren, von dem sich das Element auch im zweiten Array befindet. – CodeO

+0

Tut mir leid @CodeO.Kannst du ein Beispiel dafür geben, was du erreichen willst (ein Bild, eine Vorlage oder etwas Ähnliches)? –

+0

Kein Problem, trotzdem danke für die Hilfe. Ich habe meiner Frage oben ein Beispiel hinzugefügt – CodeO

Verwandte Themen