我正在尝试在模块之间建立一个中间点以获取自定义URL,以便用户可以保存(复制URL)状态并与其他用户共享(或返回到它)。我正在尝试构建一个简单的工作副本,然后我的目标是使其尽可能多态。
我现在有一个基本的工作副本,使用url对象存储一些变量(现在在url对象中),然后在加载的控制器中读取这些变量以更改为所需的状态。例如,我的第一个控制器的顶部是
$scope.test = $location.search().test;
所以无论test =在url中,它都会设置为$ scope.test(这些控制我的状态)。我现在已将所有内容分解为单个模块,因此我初始化模块的方法是设置这样的函数(在堆栈的其他位置找到)
function persistMod($scope, $window) {
$scope.$watch(function (){
return $window.test;
}, function(v) {
if(v == undefined ){}else{
if($scope.test !== v) {
$scope.test = v;
}
}
});
$scope.$watch('test', function(v) {
if($window.test !== v) {
$window.test = v;
}
});
$scope.$watch(function (){
return $window.test2;
}, function(v) {
if(v == undefined ){}else{
if($scope.test2 !== v) {
$scope.test2 = v;
}
}
});
$scope.$watch('test2', function(v) {
if($window.test2 !== v) {
$window.test2 = v;
}
});
}
在控制器中我只是打电话
persistMod($scope, $window);
这样做的目的是让他们分别跟踪彼此,以便在更新网址时 - 每个模块可以跟踪其他当前状态,这样就不会产生混淆。所以我可以打电话给
$location.search({mod1: $scope.test, mod2: $scope.test2});
当状态发生变化时,它会保持不变。
所以这里的问题是 - 我想把它变成一个服务,我可以注入两个模块中间,以便为我跟踪这个并相应地更改URL。所以我想知道这更多的是工厂或服务的工作。
我想:
- 跟踪有多少状态发生变化(假设最小值为2,最大值为15)并相应更改网址
- 能够为每个模块单独发送新的url并让它更新url字符串,其中包含一些帖子,如myService.urlChange(“newurlvariable”);
因此,工厂/服务必须跟踪有多少模块正在使用它并相应地进行更改。这对我来说还是新的,所以我可以使用一些指导,我已经做了一堆挖掘并且现在感觉被卡住了。任何见解都非常受欢迎。谢谢你的阅读!
答案 0 :(得分:1)
那样的东西?
angular.module(...).factory('persistMod', function ($window) {
return function persistMod($scope, name) {
//watch $window[name]
//watch $scope[name]
}
});
[...]
angular.module(...).controller('MyCtrl', function($scope, persistMod) {
persistMod($scope, 'test');
persistMod($scope, 'test2');
});
另外,为什么不简化这个:
if($window.test !== v) {
$window.test = v;
}
......用这个:
$window.test = v;
分配前无需测试。
答案 1 :(得分:1)
所以你肯定想要一家工厂。但是你需要重写大部分内容来做你想做的事。
将工厂视为单身人士非常重要,几乎就像全球职能和变量一样。你可以有这样的工厂......
app.factory('PersistMod', [
function() {
var service = {};
service.url;
service.addItem = function(item) {
service.url = service.url + item;
}
service.getUrl = function() {
return service.url;
}
return service;
}])
我不会写完整件事,但希望这会让你知道如何设置它。
设置完毕后,您可以将此工厂注入控制器,然后调用函数或获取变量。例如
PersistMod.addItem('something');
var currentUrlString = PersistMod.getUrl;
console.log(currentUrlString) // 'something'
希望这有帮助。