标签: angularjs-resource

角度资源 - 如何检查资源实例是否有任何未保存的更改?

我希望能够判断用户是否修改了$ resource实例 - 也就是说,它的当前状态是否与最初从服务器加载的状态不同&&尚未保存.我怎样才能做到这一点?

javascript angularjs angularjs-service angularjs-resource

12
推荐指数
1
解决办法
3258
查看次数

资源解析后,在ngResource对象的$ promise属性的then()函数中获取响应头?

我愿意检索资源请求的响应头,因为我在其中放入了分页信息和其他内容而不是响应主体,以使REST api清晰.

虽然我们可以从成功/错误回调中获取它,如下所示:

Object.get({type:'foo'}, function(value, responseHeaders){
    var headers = responseHeaders();
});
Run Code Online (Sandbox Code Playgroud)

'Object'是我的资源工厂服务.

此外,当我尝试在解决所需资源后更改路由时,我尝试过:

.when('/list', {
    templateUrl: 'partials/list.html',
    controller: 'ListCtrl',

    // wait for the required promises to be resolved before controller is instantialized
    resolve: {
        objects: ['Object', '$route', function(Object, $route){
            return Object.query($route.current.params).$promise;
        }]
    }
})
Run Code Online (Sandbox Code Playgroud)

并且在控制器中,只需注入"对象"而不是对象服务,因为它已经解析并填充了真实数据.

但是当我尝试从控制器中的"对象"获取头信息时,我遇到了问题.

我试过了objects.$promise.then(function(data, responseHeaders){}),但是responseHeader是未定义的.

如何更改$ resource服务的行为,以便将responseHeader getter抛出到$ promise then()回调函数中?

我的服务"对象"供参考:

myServices.factory('Object', ['$resource',
    function($resource){
        return $resource('object/:id', {id: '@id'}, {
            update: {method: 'PUT'},
        });
    }
]);
Run Code Online (Sandbox Code Playgroud)

rest angularjs angularjs-resource

12
推荐指数
2
解决办法
1万
查看次数

AngularJS:使用自定义服务转换$ resource中的响应

我试图使用来自自定义服务的数据从角度$ resource中装饰返回的数据.我的代码是:

angular.module('yoApp')
  .service('ServerStatus', ['$resource', 'ServerConfig', function($resource, ServerConfig) {
    var mixinConfig = function(data, ServerConfig) {
      for ( var i = 0; i < data.servers.length; i++) {
        var cfg = ServerConfig.get({server: data.servers[i].name});
        if (cfg) {
          data.servers[i].cfg = cfg;
        }
      }
      return data;
    };

    return $resource('/service/server/:server', {server: '@server'}, {
      query: {
        method: 'GET',
        isArray: true,
        transformResponse: function(data, header) {
          return mixinConfig(angular.fromJson(data), ServerConfig);
        }
      },
      get: {
        method: 'GET',
        isArray: false,
        transformResponse: function(data, header) {
          var cfg = ServerConfig.get({server: 'localhost'});
          return mixinConfig(angular.fromJson(data), ServerConfig); …
Run Code Online (Sandbox Code Playgroud)

javascript angularjs angular-resource angularjs-resource

11
推荐指数
2
解决办法
2万
查看次数

AngularJS和django tastypie返回的复杂JSON

我在AngularJS上编写了很少的资源来访问Tastypie API.一切都运行正常,除了细节:tastypie总是将实际结果封装在objectsJSON 的属性中,例如:

/api/v1/reminder/:

{
    meta: {
        limit: 20,
        next: null,
        offset: 0,
        previous: null,
        total_count: 3
    },
    objects: [{
        category: {
            color: "#999999",
            id: 1,
            name: "Groceries",
            resource_uri: "/api/v1/category/1"
        },
        description: "",
        due_date: "2010-10-16",
        id: 1,
        repeat: "weekly",
        resource_uri: "/api/v1/reminder/1",
        value: "-50"
    }, {
        category: {
            color: "#999999",
            id: 1,
            name: "Groceries",
            resource_uri: "/api/v1/category/1"
        },
        description: "",
        due_date: "2010-10-17",
        id: 2,
        repeat: "weekly",
        resource_uri: "/api/v1/reminder/2",
        value: "-50"
    }
}
Run Code Online (Sandbox Code Playgroud)

使用回调get()调用修复是很糟糕的:

Reminder.get().$then(function (result) {
    $scope.reminders …
Run Code Online (Sandbox Code Playgroud)

angularjs angularjs-resource

10
推荐指数
1
解决办法
3785
查看次数

AJAX调用后的Load指令

我已经建立了一个带有两个参数的分页指令; 当前页面和总页数.

<pagination page="page" number-of-pages="numberOfPages"></pagination>

问题是我只会在AJAX调用之后知道numberOfPages的值(通过ng-resource).但是我的指令已经在AJAX调用完成之前呈现.

app.controller('MyController', function ($scope, $routeParams) {
    $scope.page = +$routeParams.page || 1,
    $scope.numberOfPages = 23; // This will work just fine

    MyResource.query({
        "page": $scope.page,
        "per_page": 100
    }, function (response) {
        //This won't work since the directive is already rendered
        $scope.numberOfPages = response.meta.number_of_pages;
    });
});
Run Code Online (Sandbox Code Playgroud)

我更喜欢等待渲染我的控制器模板,直到AJAX调用完成.

当AJAX调用完成时,Plan B将使用指令模板附加模板.

我无法解决这两种情况.

angularjs angularjs-directive angularjs-resource

10
推荐指数
2
解决办法
1万
查看次数

Angular:$ http和$ resource忽略自定义标头.为什么?

我正在尝试访问我无法控制的REST服务.第一个问题是该服务不包含Access-Control-Allow-Origin标头,这是一个问题,如果我理解正确,立即限制我使用JSONP.

此外,默认情况下,此服务发送XML而不是JSON,但它能够发送JSON.我认为它应该响应我的Accept标头,负责服务的人说它看着我的Content-Type.这意味着我需要做一个POST而不是一个GET(虽然当我只是获取一些静态数据时更有意义,对吗?).

像我一样顽固,我正在尝试我的Accept标头.由于Angular只接受JSON,我希望它Accept: application/json默认使用标头,但它没有,它忽略了我手动设置它的尝试:

app.config(['$httpProvider', function($httpProvider){
    console.log($httpProvider.defaults.headers.common);
    delete $httpProvider.defaults.headers.common['X-Requested-With'];
    $httpProvider.defaults.headers.post['Accept'] = 'application/json, text/javascript';
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8';
    $httpProvider.defaults.headers.post['Access-Control-Max-Age'] = '1728000';
    $httpProvider.defaults.headers.common['Access-Control-Max-Age'] = '1728000';
    $httpProvider.defaults.headers.common['Accept'] = 'application/json, text/javascript';
    $httpProvider.defaults.headers.common['Content-Type'] = 'application/json; charset=utf-8';
    $httpProvider.defaults.useXDomain = true;
}]);
Run Code Online (Sandbox Code Playgroud)

我在实际资源中再次这样做:

return $resource('http://foo.com/getStuff', {}, {
    fetch: {
        method:'JSONP',
        params: params,
        headers: {
            'Accept':'application/json, text/javascript',
            'Content-Type':'application/json; charset=utf-8'
        },
        isArray:false,
        callback: 'JSON_CALLBACK'
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,请求标头仍然包含Accept: */*.

我的问题是:为什么?为什么Angular会忽略我的标题?我怎么能让它使用正确的标题呢?

而且:有没有办法在POST中使用JSONP?

编辑:最初我使用的是Angular 1.0.7,但我只是尝试了1.2.3并得到了相同的结果.标题被忽略,但每个人都声称这是实现目标的方法.

我也尝试直接使用$ http,而不是$ resource,使用相同的结果.

编辑2:这是一个JSFiddle.它是匿名的,并不使用我的真实服务器,但使用Firebug /开发人员工具,您可以验证它是否Accept: */*在两个调用上发送,尽管我尝试设置application/json …

jsonp http angularjs angularjs-resource

9
推荐指数
1
解决办法
2万
查看次数

响应类型为text/plain的Angular资源总是生成一个字符串数组

我创建了从休息服务接收记录数的资源作为文本.Angular从回答中为每个字符组成一个数组.例如,如果休息答案20,angular将生成数组[2,0].我可以在不转换响应或使用的情况下修复它$http吗?

var resource = angular.module('resource');
resource.factory('RecordResource', ['$resource',
    function($resource) {
        return $resource('/rest/records/:id', {}, {
            count: {
                method:'GET',
                url: "/rest/records/count",
                isArray: false,
                responseType: 'text'
            }
        }
    }
]);
Run Code Online (Sandbox Code Playgroud)

javascript arrays angularjs angularjs-service angularjs-resource

9
推荐指数
1
解决办法
6307
查看次数

AngularJS Resource - PUT方法没有得到id

我有一个工厂,它返回我的文章模型的$资源:

angular.module('ADI.Resources').factory("Articles", ['$resource', function($resource) {
    return $resource('/api/v1/article/:articleId', {
        articleId: '@_id',
        _shop: window.user._shop
    }, {
        update: {
            method: 'PUT'
        }
    });
}]);
Run Code Online (Sandbox Code Playgroud)

GET,POST并且DELETE运行良好,但不是更新(PUT).这是我使用的代码:

Articles.update({articleId: '300000000000000000000001'}, function(article){
    console.log(article);
});
Run Code Online (Sandbox Code Playgroud)

这是在提出这个要求:

PUT http://localhost:3000/api/v1/article?_shop=100000000000000000000001
Run Code Online (Sandbox Code Playgroud)

代替:

PUT http://localhost:3000/api/v1/article/300000000000000000000001?_shop=100000000000000000000001
Run Code Online (Sandbox Code Playgroud)

知道为什么在执行更新时没有填充:articleId参数?谢谢!

angularjs angularjs-resource

8
推荐指数
1
解决办法
9704
查看次数

在ngResource AngularJS中将null作为值发送

我正在使用AngularJS 1.2.1的ngResource,我试图null在PUT请求中作为参数发送值.不幸的是,当它被设置时,Angular将忽略它的参数而不发送它.

这是一些示例代码:

var User = $resource('/comments/:id', {id:'@id'}, {
  destroy: { method: 'PUT', params: {content: null} }
});
var user = User.destroy({id:123}, function() {});
Run Code Online (Sandbox Code Playgroud)

Angular将忽略content而不发送密钥和null值.

如何让Angular发送null?

javascript ajax angularjs angularjs-resource

8
推荐指数
1
解决办法
5332
查看次数

ngResource解析嵌套资源

有什么选项可以解析ngResource响应中的嵌套资源?

关于在ngResource中解析嵌套资源的端点有一些相关的问题,但是这个问题是关于REST响应何时包含嵌套在正在查询的集合中的第二个资源,特别是你不会有的1对1映射例如pets/<id>/owner作为自己的资源.

假设有两种资源,Pets并且Owners:

GET /宠物:

[{
  name: 'spark',
  type: 'dog',
  owner: '/owners/3/' # alternatively just '3' or the full object.
}]
Run Code Online (Sandbox Code Playgroud)

作为开发人员,我有时想要查询整个Owner资源,有时我想查询Pet资源然后我自动想要将owner属性解析为资源实例.

这是我目前的解决方案:

.factory('Pet', function ($resource, Owner) {
  var Pet = $resource('/pets/:id', {id: '@id'});

  Pet.prototype.getOwner = function () {
    return new Owner(this.owner); // or Owner.get({id: this.owner})
  }

  return Pet;
})
Run Code Online (Sandbox Code Playgroud)

这里的问题很多.有诚信 - 一个人.我相信,这种实现允许同一资源的多个实例.那就是实用性.你也有额外的属性来跟踪(ownergetOwner(),而不是只owner;可能setOwner,如果你希望能够保存模型).

可以构建一个替代解决方案transformResponse,但是在每个具有嵌套映射的资源中都包含该解决方案.

angularjs angularjs-resource

7
推荐指数
1
解决办法
6795
查看次数