Moje pytanie brzmi, jeśli mogę podzielić się na łowliwościami

Mam jedną funkcję

 $scope.init = function(){
        $http({
            url: url_for('account/getinfo'),
            method: "POST",
            data: fields
        }).success(function (data, status, headers, config) {


                $scope.locations = data.stores;


                $scope.currentLocation = data.stores.filter(function(store){

                    return store.mpos_id == $scope.mposid;
                });

                if ($scope.currentLocation.length > 0) {
                    $scope.currentLocation = $scope.currentLocation[0];
                }


            }).error(function (data, status, headers, config) {
            });


    };

$ Scope.CurrentLokalizacja to obiekt! Czy mogę używać tych danych OBJ w innej funkcji?

Próbowałem z kątem. Kopii i rozszerz się, bez sukcesu

$scope.getInfo = function(){
  $scope.currentLocationData = angular.copy($scope.currentLocation);
}
0
torresito 25 czerwiec 2017, 19:26

4 odpowiedzi

Najlepsza odpowiedź

Usługi w kątach są singletonami, dzięki czemu można przechowywać te dane w usłudze i wstrzyknąć go, gdziekolwiek go potrzebujesz. Jest już uważany za najlepsze praktyki, aby oddzielić żądania danych do usług, więc w każdym razie tworzysz usługę.

Oto przykład:

Najpierw oddziel logikę pobierania danych do usługi.

angular.module('app').service('accountDataService', AccountDataService);

function AccountDataService($http){
    var service = this;

    service.getInfo = function(fields){ 
        return $http.post(url_for('account/getinfo'), fields)
            .then(function(response){ return response.data.stores; });
    }
}

Następnie utwórz usługę konta, aby udostępnić pobrane dane między kontrolerami / komponentami:

angular.module('app').service('accountService', AccountService);

function AccountService(accountDataService){
    var service = this;

    service.currentLocation = {};
    service.locations = [];

    service.init = function(fields, mposid){ 

        accountDataService.getInfo(fields).then(function(stores){
            service.locations = stores;

            var currentLocations = stores.filter(function(store){
                return store.mpos_id == mposid;
            });

            if (currentLocations.length > 0) {
                service.currentLocation = currentLocations[0];
            }
        });
    }
}

Teraz wszystko, co musisz zrobić w swoich kontrolerach, należy wstrzyknąć accountService.

angular.module('app').run(function(accountService){
    accountService.init({ /* your fields */ }, '[your mposid]');
});

angular.module('app').controller('myController', MyController);

function MyController($scope, accountService){
    $scope.currentLocation = accountService.currentLocation;
}

Uruchamianie init Funkcja wewnątrz run(..) jest na przykład. Korzystnie uruchomiłbyś to w trasie rozwiązywać funkcję lub coś w ten sposób ze względu na charakter Asynchnika funkcji init.


bonusowa uwaga

Unikaj używania $scope, aby przejść zmienne do widoku. Zamiast tego użyj składni controllerAs. Możesz sprawdzić dokumentację, aby uzyskać więcej informacji na temat tego, jak to działa, lub sugeruję ci Sprawdź przewodnik stylu kątowego z Jana Papa.

2
Nikolaj Dam Larsen 25 czerwiec 2017, 16:58

Możesz uzyskać dostęp do tego obiektu w innym zakresie, jeśli i tylko wtedy, gdy ten zakres jest dzieckiem nie izolowanym poprzedniego. W tym przypadku zakres dziecka dziedziczy też wszystkie właściwości zasięgu nadrzędnego.

Więc jeśli kod ten jest zakresem sterownika, a masz inny kontroler jako dziecko tego, dziecko można uzyskać dostęp do tej nieruchomości.

Chociaż działa, wiele razy, które nie jest najlepszą praktyką, aby rozwinąć rzeczy za pomocą AngularJs. Będzie wymusić zależność między dwoma kontrolerami, a jeśli zmienisz swój kod, możesz stracić dziedzictwo i przerwać kod.

W takich przypadkach najlepszym rozwiązaniem jest zdefiniowanie usługi, która posiada wartość currentLocation. Następnie wstrzykiwać tę usługę, gdziekolwiek musisz uzyskać dostęp do tej wartości.

Mam nadzieję, że to ma sens

1
quirimmo 25 czerwiec 2017, 16:54

Jeśli szukasz Udostępnij Dane między dwoma kontrolerami / dyrektywami, a następnie należy użyć usługi i wstrzyknąć go zarówno w sterownikach / dyrektywach.

Jeśli chcesz tylko utworzyć nową kopię / klonować obiekt, możesz użyć JSON.parse(JSON.stringify($scope.currentLocation))

Mam nadzieję że to pomoże!

1
Naman Sancheti 25 czerwiec 2017, 16:42

Zdecydowanie możesz kopiować tak, że będę pracować. Możesz zameldować się poniżej przykładem.

	<!DOCTYPE html>
	<html>
	<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
	<body>

	<div ng-app ="app" ng-controller ="ctrl">
				
{{currentLocationData}}

				</div>
	<script>
	angular.module('app', []).controller('ctrl', function($scope){
    
	
	$scope.currentLocation = 'testing angular copy';
    $scope.currentLocationData = angular.copy($scope.currentLocation);
   
 
})

	</script> 

	</body>
	</html>
1
Arun 25 czerwiec 2017, 16:39