Dyrektywa z <select ng-options> i indirection

Mam kilka opcji wielokrotnego wyboru na stronie, każda z odrobiną logiki, która wypełnia ten wybór z serwera, i chcę zawinąć każdą z nich w dyrektywę.

Zanim spróbowałem zawrzeć je w dyrektywach, zbudowałem je jako takie:

index.html

<select name="groups" ng-model="inputs.groups" ng-change="groupsChanged()" ng-options="g for g in allgroups" multiple></select>

controllers.js

W pierwszym przejściu robię moje $ http połączenia stąd. Tak, wiem, nie najlepsze praktyki, ale chciałem udowodnić, że to działa na początku.

  $scope.loadSelect = function(_url) {
    $http({
      url: _url,
      method: 'POST',
      data: $scope.inputs,
      model: 'all' + _url
    }).success(function(data, status, headers, config) {
      $scope[config.model] = data;
    });
  };

  // Fill groups
  $scope.loadSelect('groups');

  // When groups change, reload other select fields that depend on groups
  $scope.groupsChanged = function() {
    $scope.loadSelect('categories');
    $scope.loadSelect('actions');
  }

Teraz chcę przenieść to do dyrektywy. Widzę dwa główne wyzwania: 1.) Jak zamknąć cały zestaw opcji (np. Jaki jest teraz model „allgroups”) w dyrektywie? 2.) Na podstawie wstępnych eksperymentów próbowałem fizycznie zbudować<select/> do szablonu, ale zdałem sobie sprawę, że muszę manipulować DOMem, aby fizycznie zastąpić nazwę, ng-model i ng-options. To doprowadziło mnie do atrybutu kompilacji, ale.), Który wydaje się niewłaściwy i b.) Ustawienie<select ng-options="x for x in allgroups" /> nie powtarza się po włożeniu do DOM. Używanie kompilacji nie jest właściwe; jaki jest właściwy sposób podejścia do tego?

Oto moja pierwsza próba dyrektywy wygląda tak. To tak naprawdę nie działa i myślę, że źle to rozumiem:

index.html

<dimension ng-model="inputs.users" alloptions-model="allusers">Users</dimension>

directives.js

directive('dimension', function() {
  return {
    restrict: 'E',
    scope: {
      ngModel: '=',
      alloptionsModel: '='
    },
    template:
        '<div>' + 
          '<label ng-transclude></label>' +
          '<fieldset>' +
              '<div class="form-group">' +
                '<select ng-model="{{ngModel}}" ng-options="x for x in {{alloptionsModel}}" multiple class="form-control"></select>' +
              '</div>' +
           '</fieldset>' +
        '</div>',

    replace: true,
    transclude: true
  };
});

Najwyraźniej jeszcze nie dotarłem jeszcze do części ładowania serwera, ale planuję zamienić ją w kontroler w Dyrektywie, z rzeczywistym wywołaniem $ http w usłudze.

Czuję, że idę w złym kierunku. Jeśli masz sugestie dotyczące wyrównywania, pomóż!

questionAnswers(1)

yourAnswerToTheQuestion