2014-10-23 3 views
0

Приложение My Grails не получает данные из запроса на отправку angularjs.

Мои AngularJS Контроллер:

module.controller('MemberCtrl', ['$scope', '$http', 
    function ($scope, $http) { 

     $scope.submitForm = function() { 
      $http.post(uri + "receiveNewMember", $scope.member) 
      .success(function (data) { 
       console.log("Data Sent With Success! " + data); 
      }) 
      .error(function (data) { 
       console.log("Fail"); 
      }); 
     }; 

    }]); 

Мой Grails Действие:

def receiveNewMember(){ 
    render text: params.name 
} 

Отладчик Остановки в действии. Но переменная params не имеет никаких данных, кроме controller и action.

Кто-то знает, как я могу это исправить?

+0

где вы получаете этот 'uri'? что внутри? –

+0

@IgorArtamonov 'uri ="/app/controller/"'. AngularJS может вызывать действие, но параметры внутри действия не содержат отправленных данных. – ricardogobbo

ответ

0

Доступ к информации о состоянии можно получить через request.JSON в контроллере Grails.

+0

Вы пытались изменить его на .get, а не на .post в сегменте http? Вы говорите, что результаты возвращаются как JSON? если бы вы попытались разобрать свои параметры с помощью JSON? https://github.com/vahidhedayati/testingarrested/blob/master/grails-app/controllers/testingarrested/NumbersController.groovy#L83 – Vahid

0

Вы можете сделать что-то подобное, чтобы эмулировать путь Grails работы: post query parameters like jQuery

Также я создал фабрику Serializer сериализовать объект любого типа яваскрипта к ожидаемому образу на Грааль:

(function() { 
    'use strict'; 
    angular.module('app').factory('Serializer', function ($filter) { 
     function SerializerService(){} 
     var serializerService = new SerializerService(); 
     serializerService.excludedProperties = ['$$hashKey']; 
     SerializerService.prototype.serialize = function(object){ 
      var results = {}; 
      this.serializeObject(results, object, ""); 
      return results; 
     }; 
     SerializerService.prototype.serializeObject = function(results, object, nameAtTheMoment){ 
      if($.isArray(object)){ 
       var array = object; 
       for (var i=0; i<object.length; i++){ 
        var newNameAtTheMoment = nameAtTheMoment + "[" + i.toString() + "]"; 
        this.serializeObject(results, array[i], newNameAtTheMoment) 
       } 
      } 
      else{ 
       if(Object.prototype.toString.call(object) === "[object Object]"){ 
        var i=0; 
        for(var property in object){ 
         if (object.hasOwnProperty(property) && this.excludedProperties.indexOf(property) == -1) { 
          var newNameAtTheMoment; 
          if(nameAtTheMoment !== "") 
           newNameAtTheMoment = nameAtTheMoment + "." + property; 
          else 
           newNameAtTheMoment = property; 

          this.serializeObject(results, object[property], newNameAtTheMoment); 
          i++; 
         } 
        } 
       } 
       else{ //the object is a simple value 
        if(Object.prototype.toString.call(object) === '[object Date]'){ 
         var dateServerFormat = window.appConfig.dateServerFormat; 
         results[nameAtTheMoment] = $filter('date')(object, dateServerFormat); 
        } 
        else 
         results[nameAtTheMoment] = object; 
       } 
      } 
     }; 
     return serializerService; 
    }); 
})(); 

И после первого описания ссылки вы можете сделать что-то вроде этого:

angular.module('app', [...]) 
    .config(function ($provide, $httpProvider) { 
     var serializer; 
     // Trick to inject dependencies on the config function. 
     $provide.factory('FactoryInjector', function() { 
      return { 
       setSerializer: function(serializerParam){ 
        serializer = serializerParam; 
       } 
      }; 
     }); 

     $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8'; 
     $httpProvider.defaults.transformRequest = [function(data) { 
      return angular.isObject(data) && String(data) !== '[object File]' ? $.param(serializer.serialize(data)) : data; 
     }]; 

    }) 

    .run(function ($rootScope, $state, $stateParams, Serializer, FactoryInjector) { 
     $rootScope.$state = $state; 
     $rootScope.$stateParams = $stateParams; 

     FactoryInjector.setSerializer(Serializer); 
    }); 
Смежные вопросы