Angularjs - 更改 html 页面时重新实例化服务

Angularjs - Service is re-instanciated when changing html page

本文关键字:实例化 服务 更改 html Angularjs      更新时间:2023-09-26

我正在尝试在这里设置一个小场景,其中我将显示一个包含所有相关输入的研究页面,继续搜索,获取结果,然后在新页面上显示结果。所以我的架构如下:

  • 角度模块(控制器 + 服务(
  • 搜索.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'). 

这样,当您切换视图时,您的焦点就不会重新加载