Angularjs - 更改 html 页面时重新实例化服务
Angularjs - Service is re-instanciated when changing html page
我正在尝试在这里设置一个小场景,其中我将显示一个包含所有相关输入的研究页面,继续搜索,获取结果,然后在新页面上显示结果。所以我的架构如下:
- 角度模块(控制器 + 服务(
- 搜索.html
- 结果.html
其中一个服务将负责启动研究并获取结果,我想使用此服务在更改页面时将数据从一个控制器传递到另一个控制器。我看到该服务是单例的每个地方,一旦实例化,就不应该再次实例化。
但是,在更改页面时,我的服务被重新实例化(所有js文件都重新加载(,当我尝试从服务中获取结果时,我有一个漂亮的: " 变量结果未定义 ">
我的代码看起来像这样:
Angularjs
angular
.module('myapp.search_controller.services')
.factory('SearchFares', SearchFares)
.controller('SearchController', SearchController);
.controller('ResultsController', ResultsController);
SearchFares.$inject = ['$cookies', '$http', 'SortFares'];
SearchController.$inject = ['$location', '$scope', 'SearchFares'];
ResultsController.$inject = ['$location', '$scope', 'SearchFares'];
function SearchFares($cookies, $http) {
var results = [];
var SearchFares = {
CheapestDests: CheapestDests,
GetResults: GetResults,
};
return SearchFares;
function SetResults (params) {
if (params) {
results = params;
return true;
}
}
function GetResults () {
return results;
}
function CheapestDests(params) {
// do whatever you want with params then set results
if (SetResults(params)) {
window.location = '/results.html';
}
};
}
function SearchController($location, $scope, SearchFares) {
// mapped to search.html with the ng-controller directive
// blablabla do something with the scope - then call the service
// On click, launch the search
$scope.search = search;
function search() {
SearchFares.CheapestDests({something: 'somewhere'});
}
}
function ResultsController ($location, $scope, SearchFares) {
// mapped to results.html with the ng-controller directive
$scope.results = SearchFares.GetResults();
// blablabla process the data
}
HTML - 搜索.html
<div ng-cloak class="row">
<form role="form" ng-submit="search()" ng-controller="SearchController" >
<!-- Fill up the input then push the bouton search
--- -->
</form>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-cookies.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-route.js"></script>
<script type="text/javascript" src="{% static 'js/search_controller.module.js' %}"></script>
HTML - 结果.html
<div ng-cloak class="row">
<div" ng-controller="ResultsController" >
<!-- Do what you need to do with $scope.results but here it is undefined
--- -->
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-cookies.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-route.js"></script>
<script type="text/javascript" src="{% static 'js/search_controller.module.js' %}"></script>
我无法避免重新实例化服务,然后将 var 结果设置为未定义(var results = {}(。有没有办法使用服务在更改页面位置时在控制器之间传递数据?
怜悯:)
奥尔丁
您正在使用 window.location="/whatever" 切换页面。当您执行此操作时,这实际上将所有服务和工厂重新加载到初始状态,因为实际上这类似于页面重新加载。
如果你想在另一个页面中得到结果,你应该使用ui-router或ngRoute或类似的东西,只需切换视图,这样工厂就不会被重新加载。
我看到您的模块中已经添加了角度路由脚本。因此,只需将搜索和结果转换为两个ng视图,并使用
$location.path('/whatever').
这样,当您切换视图时,您的焦点就不会重新加载
相关文章:
- 如何在GoogleWeb工具包(GWT)中从JSNI调用接口(实例化)
- 如何在用户输入时实例化数组
- 在requirejs中共享实例化对象
- Mongoose TypeError:实例化模式类型的对象时,对象不是函数
- Angular重命名模块后未能实例化模块
- Backbone relational无法实例化两个RelationalModel对象
- 我应该如何用javascript实例化这个日期
- AngularJS出错-无法实例化模块
- 谷歌地图重叠MarkerSpiderfier实例化问题
- 未捕获错误:由于,[$injector:moduler]未能实例化模块polmgr
- ngRoute不是因果报应实例化的
- JavaScript 中的动态实例化
- 在文本框上绑定谷歌地点自动完成,而无需实例化谷歌地图
- UI5 路由不实例化视图
- AngularJS:关于实例化服务
- Angularjs - 更改 html 页面时重新实例化服务
- 在AngularJS中实例化全局服务
- AngularJS-函数没有从服务中实例化
- 如何做:AngularJS服务或其他组件在模块加载时实例化
- 强制Angular 2子模块中的服务实例化(AngularJS运行块的替代方案)