2014-08-27 2 views
0

Я пытаюсь вызвать функцию внутри контроллера, но он работает дважды, и, как вы, возможно, знаете, это небезопасно, особенно если вы хотите вставить запись в базу данных, потому что данные дублирует "себя".Избегайте запуска углового контроллера дважды/вызов 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 «отложить» ответ и выполнить код после окончания асинхронного вызова.

Итак, я настаиваю, возможно, вопрос новичков, но я очень ценю любую помощь, которую вы можете мне дать в этом вопросе.

ответ

0

$ http.put ($ URL, {данные: Datos}) вы не должны цепь, то функция, она уже возвращает обещание контроллеру использовать

+0

Итак, вы предлагаете использовать .success сразу после $ http.put ($ url, {data: datos}) вместо. then ?. Я тоже пробовал, но он продолжает выполняться дважды. Не могли бы вы привести мне пример реализации? Спасибо за Ваш ответ. – katmel98

+0

ОК, два способа отправить форму: используя ng-submit в форме и тип ввода «submit»; и, с другой стороны, с помощью ng-click в кнопке. Я пробовал и то и другое, и это странно: при использовании метода ng-click он отлично работает, он посылает только один раз вызов контроллера, но если я использую метод ng-submit, он отправляет два запроса на контроллер. Дос это имеет какой-то смысл? – katmel98

+0

без полного кода, сложно сказать, что происходит. Например, $ window.location.href = "../../ hc_sections"; это снова вызывает тот же контроллер? – ABOS

Смежные вопросы