标签: restangular

使用Restangulars extendModel添加的功能未定义?

我有这样的服务:

.factory('Car', function(Restangular) {

    var baseCars = Restangular.all('cars');

    Restangular.extendModel('cars', function(obj) {
        obj.extraMethod = function() { console.log('method added'); };
        return obj;
    });

    return {
        show: function(id) {
            return baseCars.one(id).get();
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

和这样的控制器:

.controller('CarCtrl', function ($scope, $stateParams, Car) {

    Car.show($stateParams.id).then(function(car) {
        $scope.car = car;
        $scope.car.extraMethod();
    });
});
Run Code Online (Sandbox Code Playgroud)

但是,这会导致undefined is not a function错误$scope.car.newMethod().

有谁知道这是为什么以及如何让它工作?

angularjs restangular

6
推荐指数
1
解决办法
1051
查看次数

在拦截器中重试Restangular调用

官方的restangular文档提供此代码示例以在ErrorInterceptor中重试请求:

var refreshAccesstoken = function() {
    var deferred = $q.defer();

    // Refresh access-token logic

    return deferred.promise;
};

Restangular.setErrorInterceptor(function(response, deferred, responseHandler) {
    if(response.status === 403) {
        refreshAccesstoken().then(function() {
            // Repeat the request and then call the handlers the usual way.
            $http(response.config).then(responseHandler, deferred.reject);
            // Be aware that no request interceptors are called this way.
        });

        return false; // error handled
    }

    return true; // error not handled
});
Run Code Online (Sandbox Code Playgroud)

但是,正如它在评论中所说,第二次尝试不会触发任何拦截器,因为它直接使用$ http.

有没有办法让第二个请求也通过Restangular管道并执行ErrorInterceptor?

angularjs restangular

6
推荐指数
1
解决办法
3344
查看次数

Restangular插入模型后收集

我在一个带有post的restangular集合中插入一个模型

var collectionService = restAngular.all('collection');
var collection = collectionService.getList();

var item = {
   title : "A title"
};

collection.post(item);
Run Code Online (Sandbox Code Playgroud)

现在我可以做而不是最后一个声明:

collection.post(item).then(function(newItem) {
    collection.push(newItem);
});
Run Code Online (Sandbox Code Playgroud)

为什么插入的模型默认不插入集合中?是否有一个原因?我错过了一个电话或什么的?我想在插入模型后再次避免再次获取集合

angularjs restangular

5
推荐指数
1
解决办法
1732
查看次数

AngularJS/Restangular会话

我是否需要对会话/身份验证做一些特别的事情?我通过restangular post方法登录后,我的服务器无法看到我的会话.登录成功,但之后服务器上没有看到任何会话.如果我在正常的帖子外面登录,然后尝试请求页面,它工作正常.我还注意到chrome正在标题中发送以下内容:

Cookie:_rexbro_session=g2wAAAABaAJkAAxjdXJyZW50X3VzZXJhAmo=--E0687A67DBE48DA40B6957CBCF6E83FB0E612660
Run Code Online (Sandbox Code Playgroud)

这不是通过restangular请求发送的.

我还要提一下,当我通过restangular登录时,服务器正在响应以下标头:

set-cookie:_rexbro_session=g2wAAAACaAJkAAxjdXJyZW50X3VzZXJhAmgCZAAEdXNlcmgIZAASRWxpeGlyLlVzZXIuRW50aXR5ZAALRWxpeGlyLlVzZXJhAm0AAAASYXZvaWRpYW1AZ21haWwuY29tbQAAAA1KYXlzb24gQmFpbGV5bQAAADwkMmEkMTAkNHNsQVFFRGRDcXd1R3JNNVYwOXBTLkx3MHpVeElNLy5tbVM2eTVmc3BFa3NUbHhuTUtiMzJoB2QAFEVsaXhpci5FY3RvLkRhdGVUaW1lYgAAB91hBGEcYRFhD2EUaAdkABRFbGl4aXIuRWN0by5EYXRlVGltZWIAAAfdYQVhA2EVYR5hFmo=--D3F8D9A8355421B8571DB691ED5C082AD183B034; path=/; HttpOnly
Run Code Online (Sandbox Code Playgroud)

但我没有看到任何事情.

提前致谢.

编辑:我应该说我的服务器存储会话,api服务器,是与服务前端的服务器分开.

angularjs restangular

5
推荐指数
1
解决办法
2040
查看次数

您使用什么策略来获取和缓存分页集合,特别是在角度或重绘中?

假设一个应用程序使用暴露分页集合的REST api中的数据,并且集合中的项目数量可能无限大(即,一次获取所有项目并存储在浏览器会话中的项目太多).

什么是获取,缓存和使这些数据的缓存无效的好策略?

说,API就像,

GET /users?page=1&per_page=50
Run Code Online (Sandbox Code Playgroud)

使用如下响应(即包括收集数据+分页元数据)

{
  "paging": {
    "per_page": 20,
    "page": 1,
    "previous": null,
    "self": "/api/v1/users?per_page=20&page=1",
    "next": "/api/v1/users?per_page=20&page=2"
  },
  "data": [
    // first 20 users
  ]
}
Run Code Online (Sandbox Code Playgroud)

客户端可能会也可能不会在连续页面中加载集合,一次一页.任何客户端都可以更改集合中的用户.最终的一致性就足够了,我现在并不关心写冲突.

问题是在angularjs应用程序的上下文中,但是是一般的场景.

api rest caching angularjs restangular

5
推荐指数
1
解决办法
962
查看次数

Restangular响应和ng-repeat

我最近开始学习angularjs使用restangular与我的restfull API(sails)交谈.我偶然发现的问题是,在更改范围中的列表后,ng-repeat不会更新.

控制器:

app.controller('UsersCtrl', ['UsersSvc', '$scope', function(UsersSvc, s) {
    UsersSvc.getList().then(function (new_users) {
        s.users = new_users;
    })
    s.destroy = function (user) {
        user.remove().then(function () {
        s.users = _.without(s.users, user);
    });
}
}]);
Run Code Online (Sandbox Code Playgroud)

服务:

app.factory('UsersSvc', function(Restangular) {
    return Restangular.all('users');
});
Run Code Online (Sandbox Code Playgroud)

模板:

<div ng-controller="UsersCtrl">
    ...
    <tr ng-repeat"user in users">  
          <td>{{user.firstName}}</td>  
          <td>{{user.lastName}} </td>  
          <td>{{user.emailAddress}}</td>  
          <td>{{user.age}}</td>  
    </tr> 
    ...
</div>
Run Code Online (Sandbox Code Playgroud)

当我检查范围时,restangular对象数组被正确地分配给用户控制器的范围,但模板拒绝更新.

提前致谢

node.js angularjs sails.js restangular

5
推荐指数
1
解决办法
1047
查看次数

AngularJS:使用前/后解析/拒绝操作来增强或包装承诺

目标

我正在尝试创建一系列承诺"增强器",它们将围绕现有的承诺(简单的http请求)添加功能(如缓存,排队,重定向处理等).

问题

我正在通过这种增强承诺的方法遇到的问题是,如果增强功能将任何功能或公共可访问的属性添加到承诺中(或者如果我正在包装已经增强的承诺,例如一个重复的请求),那么当我通过返回一个新的包装它在一个新的承诺$q.

我可以使用什么模式来增强或包装承诺(如下面的两个示例中所示),但不会丢失承诺可能具有的任何其他(非冲突)增强功能?

例1

这是一个自动处理503-Retry-After错误的示例:

function _enhancePromiseWithAutoRetry(promise) {
  var enhancedPromise = $q(function(resolve, reject) {
    var newReject = get503Handler(this, resolve, reject);
    promise.then(resolve, newReject);
  });

  // 503 handling isn't enabled until the user calls this function.
  enhancedPromise.withAutoRetry = function(onRetry, timeout) {
    var newPromise = angular.copy(this);
    newPromise._503handled = true;
    newPromise._503onRetry = onRetry;
    newPromise._503timeout = timeout;
    return newPromise;
  };

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

我的想法是,如果我返回使用上述功能增强的承诺,用户可以:

someRequest.withAutoRetry().then(onSuccess, onError);
Run Code Online (Sandbox Code Playgroud)

或者更清楚(带链接):

someRequest.then(onSuccess, onAnyError)
           .withAutoRetry().then(onSuccess, onNon503Error);
Run Code Online (Sandbox Code Playgroud)

这里,then(...)如果服务器繁忙,第一次调用可能会立即出错,但之后的调用.withAutoRetry()会在重复请求之前轮询服务器,直到响应成功,或者RetryAfter返回非错误.

例2

这是另一个添加自定义缓存行为的示例: …

javascript promise angularjs restangular angular-promise

5
推荐指数
1
解决办法
1030
查看次数

Node.js和AngularJS中的CORS

我的应用程序存在CORS问题.

我的堆栈是带有Express 4的 Node.js 和使用Restangular的 AngularJS

我已经尝试过一些东西(例如),但我一直在努力:

XMLHttpRequest cannot load http://localhost:8080/api/users. Request header field Content-Type is not allowed by Access-Control-Allow-Headers.
Run Code Online (Sandbox Code Playgroud)

在服务器端,我有这个标题:

app.all('/*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  res.header("Access-Control-Allow-Methods", "GET, POST","PUT");
  next();
});
Run Code Online (Sandbox Code Playgroud)

在AngularJS部分我使用这个:

$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
Run Code Online (Sandbox Code Playgroud)

而我正在使用Restangular这样做:

var baseUsers = Restangular.all('users');
....
....
baseUsers.post(newUser).then(function(user){
console.log(user);
});
Run Code Online (Sandbox Code Playgroud)

还有一件事,在Node.js服务器中,我正在安慰req.methodOPTIONS,它说,我真的不知道为什么.

也许是傻事,希望有人可以帮助我.

谢谢!

node.js express angularjs restangular

5
推荐指数
1
解决办法
4420
查看次数

Restangular - 指定自定义ID键

在Restangular中,如果我声明一个服务,并执行PUT/PATCH/POST操作,它默认使用项目的id作为主键.但是,如果我们想使用自定义密钥呢?像slu or还是数字?

// GET to /users
Users.getList().then(function(users) {
  var user = users[0]; // user === {id: 1, number: 123456, name: "Tonto"}
  user.name = "Gonto";
  // PUT to /users/1 <-- Here the id is used. But I'd like to use number to post to PUT to /users/123456
  user.put();
})
Run Code Online (Sandbox Code Playgroud)

javascript angularjs angular-services restangular

5
推荐指数
1
解决办法
427
查看次数

AngularJS:Restangular - 如何从URL中删除查询参数

我在Main.js中使用查询参数"advertiserId"设置API基本URL.我想删除advertiserIdDemo.js 中的查询参数.注意我不想使用$location搜索参数(因为它们是来自当前窗口URL的搜索参数而不是我构建的URL).

Main.js:

  Restangular.setBaseUrl("localhost:9000/advertisers");
  Restangular.setDefaultRequestParams({
    "advertiserId": advertiserID
  });
Run Code Online (Sandbox Code Playgroud)

Demo.js

 Restangular.RemoveRequestParams({
    "advertiserId": advertiserID
 });
Run Code Online (Sandbox Code Playgroud)

javascript angularjs restangular

5
推荐指数
1
解决办法
389
查看次数