2015-06-01 2 views
0

Я не уверен, почему, но у меня есть несколько функций, называемых 2-4 раза, как только загружается маршрут. Почти любой маршрут у меня есть. Это похоже на то, что Controller запускает функции, хотя я не намерен вызывать их до ng-click и т. Д. В моем коде нет никаких наблюдателей. Я использую UI-маршрутизатор, и я назначаю контроллер как в параметрах маршрутизации, так и на самой странице. И да, я использую функцию init для перезагрузки страницы после определенных событий. Это по-прежнему дает мне тот же вопрос, прежде чем добавить, что вПроблема с функциями функции AngularJS

Я могу привести простой пример, начиная с HTML загружается:.

<a ng-click="finalizarCompra()" class="button btn-ing transition notopmargin fright">Finalizar compra</a> 

Сам контроллер:

.controller('CarritoController', 
     ['$scope', '$http', 'Carrito', 
     function ($scope, $http, Carrito, Session) { 

      $scope.initCarrito = function(){ 
       Carrito.getCart(); 
      }; 

      $scope.tieneProductos = function() { 
       return Carrito.getCart().length > 0; 
      }; 

      $scope.productos = Carrito.getCart(); 

      $scope.total = Carrito.totalCarrito(); 
      $scope.finalizarCompra = Carrito.finalizarCompra(); 
     }]) 

// The factory it's using: 

.factory('Carrito', ['$http', 'Productos', 'Session', 
      function ($http, Productos, Session){ 

     var carritoUsuario = []; 
     var todosLosProductos = Productos.todos(); 
     var unProducto = function() {} 
      return { 

      findBySKU : function(sku) { 
       console.log("Finding: " + sku + " from Carrito service findBySKU..."); 
       return _.find(carritoUsuario, function (producto){ 
        return producto.SKU == sku; 
       }); 
      }, 

      getProducto : function(id) { 
       console.log("Getting: " + id + " from Carrito service getProducto..."); 
       return Producto.findById(id); 
      }, 

      getCart : function() { 
       console.log("Getting cart from Carrito service getCart"); 
       return carritoUsuario; 
      }, 

      addToCart : function(Prod, cant, m1, m2, m3, m4, m5) { 

       unProducto.SKU = "" + Prod.stockid + m1 + m2 + m3 + m4 + m5; 
       /* 
       s*/ 
       console.log("Constructed product SKU is: "); 
       console.log(unProducto.SKU); 


       if(angular.isDefined(this.findBySKU(unProducto.SKU))) { 
        var i = _.findIndex(carritoUsuario, function (prod) { 
         return prod.SKU == unProducto.SKU 
        }); 
        carritoUsuario[i].Cantidad += unProducto.Cantidad; 
       } else { 
        carritoUsuario.push(unProducto); 
       } 
       console.log(carritoUsuario); 
      }, 


      finalizarCompra: function() { 

       var lineas = []; 

        _.forEach(carritoUsuario, function (e) { 
         var obj = { 
            "stockid" : e.stockid, 
            "cantidad" : e.Cantidad, 
            "sku" : e.SKU, 
            "precio": e.Precio 
            } 
         lineas.push(obj); 
         } 

        ) 
        var calipsoData = {idUser: Session.recallId(), 
         "lineas":lineas}; 
        console.log("Data being sent to calipso is: "); 
        console.log(angular.toJson(calipsoData)); 

       $http.post('http://restservice', 
        angular.toJson(calipsoData)) 
        .success(function (data){ 
         console.log("Alta Pedido exitoso. Data recibido: "); 
         console.log(data); 
        }) 
       } 

     }; 

    }]) 

I «Извините, если этот вопрос кажется расплывчатым, но я надеюсь, что раньше у кого-то с более уральским опытом был подобный опыт. Я просто не должен получать больше одного консольного журнала всего, что было на странице, прежде чем оно будет вызвано. И в finalizarCompra() это как-то вызывается при загрузке страницы вместо нг нажмите

UPDATE: это изменить:

$scope.finalizar = Carrito.finalizarCompra(); 

к этому

$scope.finalizar = Carrito.finalizarCompra; 

Не решить эту проблему. Тот факт, что его никогда не называют, не имеет смысла.

Console log spam

+0

Я не вижу его в коде, но и обеспечивает контроллер как в определении маршрута * и * в HTML частичное является не верно. – hgoebl

+0

Ну, я решил главный вопрос. Я должен был поставить ссылку на заводскую функцию внутри любой бесполезной функции. Выглядит уродливо, но я полагаю, что это имеет смысл.Теперь мне просто нужно выяснить, почему сама корзина покупок загружается шесть раз при загрузке страницы, потому что это * * уже в анонимной функции. – mitbanip

+0

Вы обновили свой код? Не могли бы вы удалить часть «шума» (мертвый код, не соответствующий коду)? – hgoebl

ответ

0

Проблема ваша функция выполняется при загрузке страницы из-за этой линии:

$scope.finalizarCompra = Carrito.finalizarCompra(); 

Обратите внимание, что круглые скобки () после ссылки функции вызывает функцию, которая будет выполнена. Поэтому вместо этого вам необходимо изменить его на это:

$scope.finalizarCompra = Carrito.finalizarCompra; 

Теперь вы сохраняете ссылку на функцию в области.

EDIT

Другая вещь, которая выглядит подозрительно эта функция в контроллере:

$scope.initCarrito = function(){ 
    Carrito.getCart(); 
}; 

Функция не используется в контроллере, поэтому я предполагаю, что она вызывается из шаблона HTML , Поскольку он вызывается из HTML, вы увидите, что эта функция запускается каждый раз, когда выполняется угловой дайджест (что довольно часто).

Он выглядит как код инициализации, и поэтому вы можете просто запустить его внутри контроллера. На самом деле, вам не обязательно нужна функция, и может просто сделать это:

.controller('CarritoController', 
     ['$scope', '$http', 'Carrito', 
     function ($scope, $http, Carrito) { 
      // executes only once, when the controller is created 
      Carrito.getCart(); 

      $scope.tieneProductos = function() { 
       return Carrito.getCart().length > 0; 
      }; 

      $scope.productos = Carrito.getCart(); 

      $scope.total = Carrito.totalCarrito(); 
      $scope.finalizarCompra = Carrito.finalizarCompra; 
     }])