【发布时间】:2015-01-23 15:06:37
【问题描述】:
我正在玩一个同时使用 JQuery 和 AngularJS 的网站项目。 $http 用于浏览器和服务器之间的 REST 通信。该网站的网址是localhost:8080/myproject。因此,每个页面或资源都有一个路径/myproject/someresource。为了能够轻松构建这些路径,我在bodyelement 上使用了一个数据属性:
<!DOCTYPE html>
<html>
...
<body data-url="myproject">
</body>
data-url 的实际值是通过 JSP 的<c:url value="/" /> 动态生成的。现在我想使用这个属性为$http 方法构建一些路径。为此,我使用了 JQuery:
var path = $('body').attr('data-url');
但是,我必须等待 DOM 生成结束,所以前一个被包装:
var path;
$(function() {
path = $('body').attr('data-url');
}
另一方面,我有一个用于按钮的 AngularJS $scope 函数:
<button ng-click="foo()">click</button>
...
var mainApp = angular.module('main', [ 'ngResource' ]);
mainApp.controller('myController', function($scope, $http) {
$scope.foo = function() {
$http.get(path + 'folder').success(function(response) { /* do crazy stuff */ });
};
}
为了使 Angular 代码的编译能够正常工作,它可能不会像 path 的定义那样包含在 $ 函数中。因此,path 不会在控制器定义时设置。我发现的唯一解决方案是将foo() 的定义移动到$() 中并将$http 存储在$scope 中:
mainApp.controller('myController', function($scope, $http) {
$scope.$http = $http;
}
$(function() {
var path = $('body').attr('data-url');
var $scope = angular.element($('main')).scope();
var $http = $scope.$http;
$scope.foo = function() {
$http.get(path + 'folder').success(function(response) { /* do crazy stuff */ });
};
}
这个问题有什么干净的解决方案吗?我的方式看起来像一个肮脏的黑客......
【问题讨论】:
-
你不能简单地使用
<base href="..." />标签吗? -
你能解释一下为什么需要在data-url中动态加载路径吗?如果不需要以这种方式加载它,您可以使用“普通”AngularJS 进行静态配置...
-
@sp00m 我可以使用这个标签。但这并不能解决 AngularJS 的控制器需要在完成 DOM 设置之前定义的主要问题,而这又需要在我可以通过 JQuery 查询属性之前完成。
-
@arman1991 那么您是否将
myproject硬编码到Javascript 代码中?如果是这样,我希望此值取决于某些属性,该属性可能会在顶部文件夹名称更改时由构建系统自动更改。如果您知道如何配置它,请拍摄。 -
@Bastian,我在AngularJS中发布了基本的路由配置,希望它能推动你前进......
标签: jquery angularjs url custom-data-attribute