Как поместить данные в массив внутри всплывающего окна (всплывающее окно открывается для определенного идентификатора) с помощью angularjs

0

Я успешно добавил данные в массив, используя метод push, но не смог сделать это внутри всплывающего окна, которое открывается для определенного идентификатора. Вот мой код:

<div class="form-group">
   <label class="col-sm-3" for="pwd">Speciality:</label>
   <div class="col-sm-4">  
      <input type="text" class="form-control" ng-model="spec" id="usr">
      <button type="submit" ng-click="addSpeciality()">Add </button>
    </div>

    <div class="col-sm-5">

    <ul>
       <li ng-repeat="spec in speciality">
          {{ spec }}
          <button  ng-click="removeSpeciality($index)">Remove</button>
       </li>
     </ul>
  </div>
</div>

Код контроллера:

$scope.speciality=[];

$scope.addSpeciality = function(){
   $scope.speciality.push($scope.spec);
   $scope.spec = ''; 
};

$scope.removeSpeciality = function(index) {
   $scope.speciality.splice(index, 1);
};
  • 0
    Что такое $scope.spec ? Кажется, это не определено. Вам нужно поделиться еще немного кода контроллера
  • 0
    @sami docs.angularjs.org/api/ng/directive/ngModel
Показать ещё 1 комментарий

2 ответа

0

Это точка, когда вам нужен Factory. Забудьте о хранении любых данных в контроллерах. Действительно - ЗАБЫВАЙТЕ! Единственный подходящий способ обмена данными через приложение - определить Factory вам нравится, и вводить его отдельно в каждом месте, где вы собираетесь работать с этими данными.

Вы не должны хранить данные в $scope. $scope - это привязка экземпляра к элементу DOM. Таким образом, только способ доступа к любым данным с любого уровня глубины заключается в использовании $parent что является большой ошибкой.

Ваш контроллер должен $inject этот метод Factory и call, когда вам нужно что-либо изменить в данных. Никогда не пропускайте бизнес-логику в контроллерах. Они похожи на шаблон разработки стратегии - место, где вы указываете, какая бизнес-логика должна иметь место, когда вы получили триггер (нажмите, например):

SpecialityFactory.addSpeciality = function () {
  SpecialityFactory.specialities.push({});
}

SpecialityFactory.removeSpeciality = function (idx) {
  SpecialityFactory.specialities.splice(idx, 1);
}

Таким образом, будет гораздо проще обмениваться бизнес-логикой между контроллерами:

// PageController
PageController.prototype.addSpeciality = function () {
  SpecialityFactory.addSpeciality();
};

PageController.$inject = ['SpecialityFactory'];

// ModalController
ModalController.prototype.removeSpeciality = function (idx) {
  SpecialityFactory.removeSpeciality(idx);
};

ModalController.$inject = ['SpecialityFactory'];
  • 0
    Что не так в хранении данных в контроллере, извините, я новичок в angular.
  • 1
    Вы новичок в разработке программного обеспечения, если спросите, почему Business Logic следует отделить от контроллеров . Это сделано для поддержания вашего кода поддерживаемым, где все манипуляции с данными для точных типов (в зависимости от вашего случая) инкапсулированы только в одной Factory а не размазаны по всему коду. Вы всегда будете уверены, что эти данные могут быть изменены в одном месте, и если вы столкнетесь с ошибкой, связанной с ними, у вас будет только 1 место для поиска, вместо того, чтобы искать по всем вашим файлам.
Показать ещё 3 комментария
0

Ну, в первую очередь @Apperion прав, прочитайте его ответ, но чтобы заставить ваш код работать, попробуйте добавить контроллер в свой HTML-элемент оболочки

<div class="form-group" ng-controller="ExampleController">

а также

с этим массивом ваш ng-repeat не будет работать таким образом, вам нужно использовать этот способ:

<li ng-repeat="spec in speciality track by $index">
  • 0
    Я думаю, его всплывающее уже внутри этого. Я надеялся, что

Ещё вопросы

Сообщество Overcoder
Наверх
Меню