Javascript 控制器之间的角度服务

Javascript 控制器之间的角度服务,javascript,angularjs,angular-services,angular-controller,Javascript,Angularjs,Angular Services,Angular Controller,我有一个加载时为空的服务: app.factory("bookmark",function(){ var bookmark = {}; return bookmark; }); 我有一个控制器,它设置服务的值,并重定向到第二个控制器,在那里我尝试访问空的服务值 控制器A: app.controller('bookmarksController', function($scope, localStorageService, bookmark) { // localStorag

我有一个加载时为空的服务:

app.factory("bookmark",function(){
    var bookmark = {};
    return bookmark;
});
我有一个控制器,它设置服务的值,并重定向到第二个控制器,在那里我尝试访问空的服务值

控制器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>
而不是

 $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());
}

@阿比拉什给出了解决方案,让我解释一下原因

您需要理解通过引用传递的
和通过值传递的
之间的区别:

您定义了一个服务
书签
,实际上它类似于:

您将服务
书签
注入控制器。在本例中,
书签
是一个参考。当你在做
bookmark=key,您丢失了对内存中真实对象的引用:

这就是为什么您的服务不能在控制器之间共享。因为你的修改实际上不会产生影响


解决方案:请参阅@Abhilash的答案。

书签服务是!=$范围。书签$作用域不会持久化路由更改(据我所知),我需要使用service/factory…每次调用bookmark service时,它都会创建一个新的bookmark var,您可以这样尝试:if(!bookmark){bookmark={};}return bookmark;使用$rootScope是一种糟糕的做法。
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());
}