使用angular 1.1.5,需要将urlencoded数据传递到后端。我已经从这里开始将其与解决方案一起使用:
How can I post data as form data instead of a request payload?

$http({
    method: 'POST',
    url: url,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    transformRequest: function(obj) {
        var str = [];
        for(var p in obj)
        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
        return str.join("&");
    },
    data: xsrf
}).success(function () {});


我已经成功地将其嵌入到控制器中,但是“更清洁”的方式是使用服务和$ resource而不是$ http对象。
在此主题下,可以在1.1.2之后将transformRequest与$ resource一起使用:
$resource transformResponse not working
但我找不到任何可行的例子。谁能使用$ resource作为服务对象提供上述解决方案的示例?

最佳答案

$ RESOURCE示例

对于csrf,在Rails应用中,您必须在标题布局中添加<%= csrf_meta_tags %>(如果默认情况下不存在)

var app = angular.module('app', ['ngResource']);
app.config(["$httpProvider", function(provider)
{
      provider.defaults.headers.common['X-CSRF-Token'] = $('meta[name=csrf-token]').attr('content');
}]);


这是服务对象

app.factory('$folders', ['$resource', function($resource)
{
    return $resource('/folders/:id',
            { id: '@id' },
            {
              list: { method: 'GET' , isArray: true }, //same as query
              create: { method: 'POST' }, // same as save
              update: { method: 'PUT' }
              // DEFAULT IMPLEMENTATION OF $RESOURCE
              //   'get':    {method:'GET'},
              //   'save':   {method:'POST'},
              //   'query':  {method:'GET', isArray:true},
              //   'remove': {method:'DELETE'},
              //   'delete': {method:'DELETE'}
            });
}]);


这是控制器的示例

app.controller('projectController', ['$scope', '$folders', function($scope, $folders)
{
    $scope.folders = $folders.list();
}]);


Folders.list()将自动在服务器上执行GET /folders/并将结果(应该为json)作为对象返回。

小费:

在控制器中的$scope.folders = Folders.list();之后,$scope.folders将立即为空,并在响应从服务器返回时及时填充。

$ http和$ ressources的简单示例
http://jsfiddle.net/jhsousa/aQ4XX/

关于表格

这是一种形式

%form{'ng-submit' => 'create(item)', 'ng-controller' => 'projectController', 'ng-init' => 'item.orientation=1;'}
  %input{'ng-model'=>'item.folderName', :type => :text, :placeholder => 'Name', :name => 'folderName'}
  %textarea{'ng-model'=>'item.description', :placeholder => 'Description', :required=>true, :name => 'description'}
  %input{'ng-model'=>'item.orientation', :type=>'radio', :name=>'orientation', :value=>'1'}
  %input{'ng-model'=>'item.orientation', :type=>'radio', :name=>'orientation', :value=>'2'}
  %input{:type => :submit, :value => 'Create', :name => 'new-project'}


您会注意到ng-model
'ng-model'=>'item.folderName'将在$scope.item中创建一个projectController,并在其中添加键folderName。其他ng-model的也一样。

'ng-init'=>'item.orientation=1;'将执行表达式。因此它将执行以下item.orientation=1,这样我们就可以为无线电输入设置默认值,非常简单。

提交表单后,ng-submit将捕获该表单,并以create作为参数从projectController调用item动作,无需说item将包含输入值?

这是控制器部分

app.controller('projectController', ['$scope', '$folders', function($scope, $folders)
{
    $scope.create = function(item)
    {
        f = new $folders(item);
        f.$save(function(data,headers)
                {
                   alert('SAVED');
                },
                function(err,headers)
                {
                    alert('FAILED');
                });
    };
}]);


$scope.create是将由ng-submit调用的操作,item也是表单中的item参数,因此您会在其中找到诸如item.description之类的东西。

Folders是我们前面讨论的服务对象。

09-11 17:43
查看更多