angular控制器之间的服务
angular service between controllers
我有一个加载时为空的服务:
app.factory("bookmark",function(){
var bookmark = {};
return bookmark;
});
我有控制器 A,它设置服务的值并重定向到第二个控制器,在那里我尝试访问空的服务值。
控制器A:
app.controller('bookmarksController', function($scope, localStorageService, bookmark) {
// localStorageService.clearAll();
$scope.bookmarks = localStorageService.keys();
$scope.setBookmarkServ = function (key){
console.log('bookmark service set');
bookmark = key;
console.log(bookmark);
}
$scope.go2bookmark = function (key){
console.log('go2bookmark called');
var obj = localStorageService.get(key);
return obj.link;
}
});
模板 A:
<script type="text/ng-template" id="bookmarks">
<div ng-controller="bookmarksController">
<hr style="clear:both;opacity:0;" />
<div class="logo"></div>
<h1>Bookmarks</h1>
<div ng-repeat="mark in bookmarks" class="col-xs-12 col-sm-6 col-md-3">
<a ng-click="setBookmarkServ(mark)" ng-init="theLink = go2bookmark(mark)" href="#{{theLink}}" class="thumbnail alert-info" style="height:150px;">
<div class="caption">
<h3>{{ mark }}</h3>
{{theLink}}
</div>
</a>
</div>
</div>
</script>
服务为空的控制器 B:
app.controller('baselistController', ['$scope', '$routeParams', '$route', '$http', 'customview', '$location', '$uibModal', '$cacheFactory', '$templateCache', 'columnselector', '$interval', '$rootScope', 'globalVarService', '$window', '$controller', '$timeout', 'localStorageService', 'bookmark',
function ($scope, $routeParams, $route, $http, customview, $location, $uibModal, $cacheFactory, $templateCache, columnselector, $interval, $rootScope, globalVarService, $window, $controller, $timeout, localStorageService, bookmark) {
//set value doesn't perist
console.log(bookmark);
...
...
而不是
$scope.bookmarks = localStorageService.keys();
将书签保存在
$rootScope.bookmarks = localStorageService.keys();
因此它们将在整个应用程序中共享。
app.factory("bookmark",function(){
var _bookmark = {};
var setBookMark = function(key){
_bookmark = key;
}
var getBookMark = function(){
return _bookmark;
}
return {
GetBookMark = getBookMark,
SetBookMark = setBookMark
};
});
现在您可以使用此服务来设置和获取书签,
在控制器A中,
app.controller('bookmarksController', function($scope, localStorageService, bookmark) {
bookmark.SetBookMark(localStorageService.keys(););
}
并在控制器B中获取书签,
app.controller('baselistController', ['$scope', '$routeParams', '$route', '$http', 'customview', '$location', '$uibModal', '$cacheFactory', '$templateCache', 'columnselector', '$interval', '$rootScope', 'globalVarService', '$window', '$controller', '$timeout', 'localStorageService', 'bookmark',
function ($scope, $routeParams, $route, $http, customview, $location, $uibModal, $cacheFactory, $templateCache, columnselector, $interval, $rootScope, globalVarService, $window, $controller, $timeout, localStorageService, bookmark) {
console.log(bookmark.GetBookMark());
}
@Abhilash给出了解决方案,我来解释一下原因。
您需要了解 passed by reference
和 passed by value
之间的区别:What's the difference between passing by reference vs. passing by value?。
你定义了一个服务bookmark
,实际上它是这样的:
您将服务 bookmark
注入了您的控制器。在这种情况下,bookmark
是一个引用。当你在做bookmark = key;
时,你丢失了对内存中真实对象的引用:
这就是为什么您的服务不能在控制器之间共享的原因。因为你的修改实际上并没有产生影响。
解决方案:参见@Abhilash 的回答。
我有一个加载时为空的服务:
app.factory("bookmark",function(){
var bookmark = {};
return bookmark;
});
我有控制器 A,它设置服务的值并重定向到第二个控制器,在那里我尝试访问空的服务值。
控制器A:
app.controller('bookmarksController', function($scope, localStorageService, bookmark) {
// localStorageService.clearAll();
$scope.bookmarks = localStorageService.keys();
$scope.setBookmarkServ = function (key){
console.log('bookmark service set');
bookmark = key;
console.log(bookmark);
}
$scope.go2bookmark = function (key){
console.log('go2bookmark called');
var obj = localStorageService.get(key);
return obj.link;
}
});
模板 A:
<script type="text/ng-template" id="bookmarks">
<div ng-controller="bookmarksController">
<hr style="clear:both;opacity:0;" />
<div class="logo"></div>
<h1>Bookmarks</h1>
<div ng-repeat="mark in bookmarks" class="col-xs-12 col-sm-6 col-md-3">
<a ng-click="setBookmarkServ(mark)" ng-init="theLink = go2bookmark(mark)" href="#{{theLink}}" class="thumbnail alert-info" style="height:150px;">
<div class="caption">
<h3>{{ mark }}</h3>
{{theLink}}
</div>
</a>
</div>
</div>
</script>
服务为空的控制器 B:
app.controller('baselistController', ['$scope', '$routeParams', '$route', '$http', 'customview', '$location', '$uibModal', '$cacheFactory', '$templateCache', 'columnselector', '$interval', '$rootScope', 'globalVarService', '$window', '$controller', '$timeout', 'localStorageService', 'bookmark',
function ($scope, $routeParams, $route, $http, customview, $location, $uibModal, $cacheFactory, $templateCache, columnselector, $interval, $rootScope, globalVarService, $window, $controller, $timeout, localStorageService, bookmark) {
//set value doesn't perist
console.log(bookmark);
...
...
而不是
$scope.bookmarks = localStorageService.keys();
将书签保存在
$rootScope.bookmarks = localStorageService.keys();
因此它们将在整个应用程序中共享。
app.factory("bookmark",function(){
var _bookmark = {};
var setBookMark = function(key){
_bookmark = key;
}
var getBookMark = function(){
return _bookmark;
}
return {
GetBookMark = getBookMark,
SetBookMark = setBookMark
};
});
现在您可以使用此服务来设置和获取书签,
在控制器A中,
app.controller('bookmarksController', function($scope, localStorageService, bookmark) {
bookmark.SetBookMark(localStorageService.keys(););
}
并在控制器B中获取书签,
app.controller('baselistController', ['$scope', '$routeParams', '$route', '$http', 'customview', '$location', '$uibModal', '$cacheFactory', '$templateCache', 'columnselector', '$interval', '$rootScope', 'globalVarService', '$window', '$controller', '$timeout', 'localStorageService', 'bookmark',
function ($scope, $routeParams, $route, $http, customview, $location, $uibModal, $cacheFactory, $templateCache, columnselector, $interval, $rootScope, globalVarService, $window, $controller, $timeout, localStorageService, bookmark) {
console.log(bookmark.GetBookMark());
}
@Abhilash给出了解决方案,我来解释一下原因。
您需要了解 passed by reference
和 passed by value
之间的区别:What's the difference between passing by reference vs. passing by value?。
你定义了一个服务bookmark
,实际上它是这样的:
您将服务 bookmark
注入了您的控制器。在这种情况下,bookmark
是一个引用。当你在做bookmark = key;
时,你丢失了对内存中真实对象的引用:
这就是为什么您的服务不能在控制器之间共享的原因。因为你的修改实际上并没有产生影响。
解决方案:参见@Abhilash 的回答。