3

I haben eine Leistung, die auf Last leer ist:Winkeldienst zwischen Controllern

app.factory("bookmark",function(){ 
    var bookmark = {}; 
    return bookmark; 
}); 

Ich habe eine Steuereinheit, die den Wert des Dienstes setzt und Umleitungen an zweiten Controller, wo ich versuche, die Service-Wert für den Zugriff auf die leer ist .

-Controller 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; 
    } 
}); 

Template 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> 

Controller-B, wo der Service ist {} leer:

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); 
    ... 
    ... 

Antwort

4
app.factory("bookmark",function(){ 
    var _bookmark = {}; 
    var setBookMark = function(key){ 
     _bookmark = key; 
    } 

    var getBookMark = function(){ 
     return _bookmark; 
    } 
    return { 
     GetBookMark = getBookMark, 
     SetBookMark = setBookMark 
    }; 
}); 

Jetzt können Sie diesen Service nutzen, um Lesezeichen zu setzen und zu erhalten,

In Controller A,

app.controller('bookmarksController', function($scope, localStorageService, bookmark) { 
     bookmark.SetBookMark(localStorageService.keys();); 
} 

Und Lesezeichen erhalten in Controller-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()); 
} 
+0

thx mate ... alles gut –

-2

Statt

$scope.bookmarks = localStorageService.keys(); 

speichern Sie die Lesezeichen in

$rootScope.bookmarks = localStorageService.keys(); 

so werden sie über die App geteilt werden.

+0

Lesezeichen-Service ist! = $ scope.bookmarks ...... $ scope wird keine Routenänderungen beibehalten (so weit mein Verständnis geht) Ich brauche die Verwendung von service/factory ... –

+0

Jedes Mal, wenn Sie den Bookmark-Dienst aufrufen, erstellt er ein neues Lesezeichen var , können Sie versuchen, so: if (! Lesezeichen) { bookmark = {}; } Lesezeichen zurückgeben; –

+0

Es ist eine schlechte Übung, $ rootScope zu verwenden. –

4

@Abhilash gibt die Lösung, lassen Sie mich den Grund erklären.

Sie müssen den Unterschied zwischen passed by reference und passed by value: What's the difference between passing by reference vs. passing by value? verstehen.

Sie einen Dienst definiert bookmark, es ist eigentlich wie:

enter image description here

Sie den Dienst bookmark an Ihre Steuerung injiziert. In diesem Fall ist bookmark eine Referenz. Wenn Sie bookmark = key; tun, können Sie den Bezug auf das reale Objekt im Speicher verloren:

enter image description here

Deshalb ist Ihr Dienst kann zwischen den Controllern nicht geteilt werden. Weil Ihre Änderung keinen Einfluss hat.

Lösung: siehe @ Abhilashs Antwort.