Я успешно добавил данные в массив, используя метод 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);
};
Это точка, когда вам нужен 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'];
Factory
а не размазаны по всему коду. Вы всегда будете уверены, что эти данные могут быть изменены в одном месте, и если вы столкнетесь с ошибкой, связанной с ними, у вас будет только 1 место для поиска, вместо того, чтобы искать по всем вашим файлам.
Ну, в первую очередь @Apperion прав, прочитайте его ответ, но чтобы заставить ваш код работать, попробуйте добавить контроллер в свой HTML-элемент оболочки
<div class="form-group" ng-controller="ExampleController">
а также
с этим массивом ваш ng-repeat не будет работать таким образом, вам нужно использовать этот способ:
<li ng-repeat="spec in speciality track by $index">
$scope.spec
? Кажется, это не определено. Вам нужно поделиться еще немного кода контроллера