Я пытаюсь вызвать функцию внутри контроллера, но он работает дважды, и, как вы, возможно, знаете, это небезопасно, особенно если вы хотите вставить запись в базу данных, потому что данные дублирует "себя".Избегайте запуска углового контроллера дважды/вызов Ajax
Здесь у вас есть код, я использую
модуля Factory и контроллер я использую это (содержится в AdminController.js
):
var $biocompadmin = angular.module('BioCompAdminApp', ['ngGrid'], function($interpolateProvider) {
// Se ha cambiado la nomenclatura de Angular {{}} para que no choque con la de Blade
// en Laravel. Ahora se empleará <% %>.
$interpolateProvider.startSymbol('<%');
$interpolateProvider.endSymbol('%>');
});
$biocompadmin.factory('modifyHCSection', function($http, $q){
return{
executeCode: function(obj){
//console.log("antes ...");
var deferred = $q.defer();
var datos = [];
item = {};
item['search'] = obj;
datos.push(item);
datos = JSON.stringify(obj);
$url = '../../hc_sections/' + obj.id;
$http.put($url, {data:datos})
.then(function(result) {
//resolve the promise as the data
//console.log(result.data[1]['name']);
console.log("Ejecucion A: " + result.data);
deferred.resolve(result.data);
});
return deferred.promise;
}
};
});
$biocompadmin.controller("modHCSectionCtrl", function($scope,modifyHCSection,$window) {
$scope.formData = {};
$scope.sendForm = function() {
modifyHCSection.executeCode($scope.formData).then(function(data){
console.log(data);
if(data['success']){
alert(data['message']);
$window.location.href ="../../hc_sections";
}else{
alert(data['errors']['fallo']);
}
//$scope.message = data.message;
});
};
});
HTML, является:
<div ng-controller="modHCSectionCtrl" id="modHCSection">
<div class="panel panel-default" id="editHCSection" >
<div class="panel-heading" ><h3 class="panel-title">Modificando la Sección Pediatria</h3></div>
<div class="panel-body">
<form id="modHCSectionForm" name="modHCSectionForm" ng-submit="sendForm()"
>
<input type="hidden" ng-model="formData.id" ng-init="formData.id='11'" />
<div class="col-md-12 form-group">
<label class="control-label">Nombre</label>
<input type="text" class="form-control" name="name" id="name" placeholder="" ng-model="formData.name" ng-init="formData.name='Pediatria'"
data-bv-notempty="true"
data-bv-notempty-message="El nombre de la sección es obligatorio y no puede estar vacío"
data-bv-stringlength="true"
data-bv-stringlength-max="100"
data-bv-stringlength-message="La longitud del nombre debe ser menor de 100 caracteres"
/>
</div>
<br>
<div class="col-md-12 form-group">
<label class="control-label">Contacto</label>
<input type="text" class="form-control" name="contact" id="contact" placeholder="" ng-model="formData.contact" ng-init="formData.contact='Manuel Pena'"
data-bv-notempty="true"
data-bv-notempty-message="El nombre del contacto es obligatorio y no puede estar vacío"
data-bv-regexp="true"
data-bv-regexp-regexp="^[a-zA-Z\s]+$"
data-bv-regexp-message="El nombre del contacto solo puede contener caracteres y espacios en blanco sencillos"
/>
</div>
<br>
<div class="col-md-6 form-group">
<label class="control-label">Telefono 1</label>
<input type="text" class="form-control" name="phone1" id="phone1" placeholder="" ng-model="formData.phone1" ng-init="formData.phone1=''"
/>
</div>
<div class="col-md-6 form-group">
<label class="control-label">Telefono 2</label>
<input type="text" class="form-control" name="phone2" id="phone2" placeholder="" ng-model="formData.phone2" ng-init="formData.phone2=''"
/>
</div>
<br>
<div class="row">
<div class="col-md-6 pull-right">
<div class="pull-right">
<button id='modifyHCSection_Cancel' type="button" class="btn btn-danger">Cancelar</button>
<button id='modifyHCSection_Save' type="submit" class="btn btn-primary">Guardar</button>
</div>
</div>
</div>
</form>
</div>
</div>
Подход 1: не повторять вызов контроллера дважды
Я пробовал Я supose нет двойного вызова в HTML
подход 2: взять на себя функцию передачи данных от контроллера
Как вы можете видеть, что я создать фабрику, чтобы отделить данные от контроллера, и я использую $ q.defer «отложить» ответ и выполнить код после окончания асинхронного вызова.
Итак, я настаиваю, возможно, вопрос новичков, но я очень ценю любую помощь, которую вы можете мне дать в этом вопросе.
Итак, вы предлагаете использовать .success сразу после $ http.put ($ url, {data: datos}) вместо. then ?. Я тоже пробовал, но он продолжает выполняться дважды. Не могли бы вы привести мне пример реализации? Спасибо за Ваш ответ. – katmel98
ОК, два способа отправить форму: используя ng-submit в форме и тип ввода «submit»; и, с другой стороны, с помощью ng-click в кнопке. Я пробовал и то и другое, и это странно: при использовании метода ng-click он отлично работает, он посылает только один раз вызов контроллера, но если я использую метод ng-submit, он отправляет два запроса на контроллер. Дос это имеет какой-то смысл? – katmel98
без полного кода, сложно сказать, что происходит. Например, $ window.location.href = "../../ hc_sections"; это снова вызывает тот же контроллер? – ABOS