Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在AngularjS中更改路线时保持状态_Javascript_Angularjs - Fatal编程技术网

Javascript 在AngularjS中更改路线时保持状态

Javascript 在AngularjS中更改路线时保持状态,javascript,angularjs,Javascript,Angularjs,我使用的是AngularJS 1.0,需要在页面上维护状态(用户输入的数据),即使用户导航(角度路由)到另一个页面,然后返回到原始页面。下面是它的外观: 从我在网上读到的内容来看,解决方案是使用服务/工厂来存储数据。下面是我的一个实现片段(请注意注释;它们解决了我的问题): 这是一家存储州信息的工厂: app.factory('cassetteRepository', ['$http', '$rootScope', function ($http, $rootScope) { var

我使用的是AngularJS 1.0,需要在页面上维护状态(用户输入的数据),即使用户导航(角度路由)到另一个页面,然后返回到原始页面。下面是它的外观:

从我在网上读到的内容来看,解决方案是使用服务/工厂来存储数据。下面是我的一个实现片段(请注意注释;它们解决了我的问题):

这是一家存储州信息的工厂:

app.factory('cassetteRepository', ['$http', '$rootScope', function ($http, $rootScope) {
    var state = {
        userEnteredSubId: '',
        cassettes: [],
        numberOfCassettesToShow: 10,
        subId1: '',
        subId2: '',
        subId3: ''
    }

    return state;
}]);
我的问题是:真的吗?似乎必须有一个更优雅的方法。我只展示了控制器的一部分。每次设置变量时,我都必须记住在保持状态的工厂中设置它的对应项。我错过什么了吗?有更好的方法吗

如果您仅使用它来保存值,那么我将使用值而不是创建服务。以下是如何设置角度值:

angular.module('yourAppName')
    .value('cassetteRepository', { data: {} });
现在,您可以注入该值并直接使用其数据属性,这样就不必更新两次。以下是如何在控制器中使用它:

angular.module('yourAppName')
    .controller('yourControllerName', ['$scope', 'cassetteRepository', function($scope, cassetteRepository) {
        // create a local scope reference if you need to use this in your view
        $scope.cassetteRepository = cassetteRepository;

        // now when you set properties on $scope.cassetteRepository.data they are set on
        // the value and are persisted and shared across your app.
        // you can also use ng-model to two-way bind in your view.
        $scope.onClickCassette = function (cassette) {
            $scope.cassetteRepository.data.subId1 = cassette._content[0].SolarPanel.SubId;
            $scope.cassetteRepository.data.subId2 = cassette._content[1].SolarPanel.SubId;
            $scope.cassetteRepository.data.subId3 = cassette._content[2].SolarPanel.SubId;
        };
});
您不必在值中使用
数据
对象。您也可以直接定义属性。例如:

.value('cassetteRepository', { userEnteredSubId = "", cassettes = [], numberOfCassettesToShow = 10, etc. })

这样,您就可以提供默认值并消除
.data
部分。

ooooh,我喜欢这样。因此,我的视图将引用$scope上repository属性中的属性,对吗?让我来试一试……没错。视图没有直接访问该值的权限,这就是为什么必须将其放入
$scope
属性中的原因。实际上,通过将我现有的CastedRepository设置为scope上的属性,同样的概念也起到了作用。谢谢哦,我完全不知道你已经设置好了并返回状态。哦!我的错,这是我需要的概念。这将在这个网站的整个生命周期中为我节省大量繁琐的工作。谢谢你!
.value('cassetteRepository', { userEnteredSubId = "", cassettes = [], numberOfCassettesToShow = 10, etc. })