I have the following AngularJS application composed of a template (index.html
), an app definition (app.js
), a controller definition (controllers.js
) and a hosting page (host.jsp
).
The code is as follows:
search.jsp
<div class="container-fluid" ng-app="facetedSearch">
<div class="row-fluid" ng-view>
</div>
</div>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js"></script>
<script src="/resources/js/page/search/app.js"></script>
<script src="/resources/js/page/search/controllers.js"></script>
app.js
angular.module('MyApp', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/', {templateUrl:'/index.html', controller: MyController}).
otherwise({redirectTo: '/'});
}]);
controller.js
var MyController=['$scope','$http','$location',function ($scope, $http, $location) {
//do some fancy stuff
if($scope.myAttribute===undefined){
$scope.myAttribute=someDataFromHttpRequest;
}
$location.search(someParameters);
}];
index.html and host.jsp are not shown for brevity and their irrelevance.
The controller gets some data from Ajax request, stores some of it in the $scope
to avoid requesting it again and the shows it to the user and waits for input. When the user selects some data in the view, I update URL query part to reflect selection changes. But I want to avoid subsequent Ajax requests by checking if the data is available in the $scope
.
The problem I'm facing is that the $scope.myAttribute
is always undefined. It resets on every request. I think I'm misusing AngularJS. Any clue?
Explanation: No, the '$scope' cannot be injected while creating service using 'factory' method.
The primary responsibility of the controller is to create a scope object and thereby pass it to the view. With this, we come to an end of this AngularJS Controllers article.
Now that you understand the components involved in an AngularJS application, you need to understand what happens during the life cycle, which has three phases: bootstrap, compilation, and runtime.
The scope is the binding part between the HTML (view) and the JavaScript (controller). The scope is an object with the available properties and methods. The scope is available for both the view and the controller.
When you leave a controller, the scope gets destroyed. I would look into making a service that stores the stuff you want.
angular.module('MyApp', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/', {templateUrl:'/index.html', controller: MyController}).
otherwise({redirectTo: '/'});
}])
.service("myService", function(){
this.myAttribute = null;
});
var MyController=['$scope','$http','$location', 'myService',function ($scope, $http, $location, myService) {
//do some fancy stuff
if(myService.myAttribute===null){
myService.myAttribute=someDataFromHttpRequest;
}
$location.search(someParameters);
}];
Services are used to share date between multiple controllers/directives so i'm pretty sure it's what you want.
Here's the doc information on them: http://docs.angularjs.org/guide/dev_guide.services.creating_services
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With