避免两次运行Angular Controller / Ajax调用

时间:2014-08-27 20:59:40

标签: javascript angularjs

我尝试在控制器内部调用一个函数,但它会运行两次,因为您可能知道这是不可行的,特别是如果您想将记录插入数据库,因为数据重复"本身" 。

这里有代码I' m

我使用的模块,工厂和控制器就是这个(包含在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:不重复控制器调用两次

我试试,我认为HTML中没有双重调用

方法2:从控制器中取出数据功能

正如您所看到的,我创建了一个工厂来将数据与控制器分开,并且我使用$ q.defer来推迟&#34;延迟&#34;异步调用结束后的答案和执行代码。

所以,我坚持认为,也许是一个新手问题,但我非常感谢你能帮助我解决这个问题。

1 个答案:

答案 0 :(得分:0)

$ http.put($ url,{data:datos})你不应该链接那个函数,它已经向控制器返回一个使用的承诺