我正在阅读关于Restangular的内容,并且随处可见提到Restangular承诺和Angular工作聪明,模板在这样的情况下更新:
由于Angular支持我们尽快设置范围变量的承诺 从服务器获取信息,它将显示在我们的模板
中
$scope.something = Restagular.one('something').get();
我正在尝试做同样的事情,但Restangular正在服务中,因为我想保持我的控制器清洁。当我向REST API发出请求时,Angular模板没有更新,我收到此错误:
XMLHttpRequest无法加载
http://localhost:3000/api/template/1
。请求被重定向到'http://localhost:3000/api/template/1/'
,对于需要预检的跨域请求,我们不允许这样做。
这是我的代码: 在服务中......
myAppServices.service('TemplateService', ['$http', '$cookies', '$cookieStore', Restangular',
function($http, $cookies, $cookieStore, Restangular) {
Restangular.setBaseUrl(constants.serverAddress);
var getTemplate = function(templateId) {
// Check the input
if (!isValidId(templateId))
return;
return Restangular.one('api/template', templateId).get();
};
// Public getters
this.getTemplate = getTemplate;
}]);
控制器中
$scope.currentCard = TemplateService.getTemplate(1);
在这种情况下,问题出在哪里 - 在客户端或服务器上。对于我的API,我使用django-rest-framework但是当我获得包含所有模板的列表(没有特定ID)时,我没有遇到任何问题。
我知道我可以尝试从服务中返回一个promise,然后从它的.then()来设置我的范围变量,但在Restangular的官方repo中提到了这个并且我想使用它,因为代码保持干净。
答案 0 :(得分:2)
您遇到的问题是因为Django会自动将没有斜杠的网址重定向到包含斜杠的网址。这不是特定于框架的,正如我最近发现的it is an issue for ExtJS as well。
因为您要求的网址api/templates/1
没有斜杠,并且api/templates/1/
正在提供API,所以Django会自动将请求从一个位置重定向到另一个位置。通常这个问题是一个问题,你只是看到控制台中发生的重定向而没有人关心,但CORS要求你拥有你请求的网址的权限,这意味着它无法重定向。 / p>
您可以通过以下两种方式解决此问题:在客户端或服务器端。
如果要在客户端上修复此问题,并保持服务器需要斜杠,则需要告诉restangular在末尾添加斜杠。 Restangular allows you to do this设置
RestangularProvider.setRequestSuffix('/');
在你的代码中,它会告诉restangular总是添加尾部斜杠。
如果您想在服务器端修复此问题,则需要停止在API中使用斜杠。这会产生令人不快的副作用,不允许任何带斜杠的请求,并且可能会破坏按预期工作的现有应用程序。 {/ 3}}在初始化路由器时设置trailing_slash=False
。
router = SimpleRouter(trailing_slash=False)
这将告诉Django REST Framework注册所有不带斜杠的URL。