【问题标题】:Run controller only first time tab was clicked - AngularJS仅在第一次单击选项卡时运行控制器 - AngularJS
【发布时间】:2019-08-16 18:39:58
【问题描述】:

我正在为我们公司开发一个网站,其中一个页面包含几个标签:

我希望每个选项卡只执行一次加载操作,而不是每次单击它,因为这些选项卡有一些 API 调用,并且重新加载需要时间。

最好的方法是什么?我正在使用 Ui-router 和 ui-sref 在每个选项卡之间移动:

<div class="col-xs-2">
        <div class="panel panel-default">
            <div class="list-group panel panel-default">

                <a ui-sref="dashboards.firstTab" ui-sref-active="active" class="list-group-item" id="firstTab_button">
                    <i style="color:darkblue" class="fa fa-area-chart"></i>&nbsp; TAB1 </a>

                <a ui-sref="dashboards.secondTab" ui-sref-active="active" class="list-group-item" id="secondTab_button">
                    <i style="color:darkblue" class="fa fa-line-chart"></i>&nbsp; TAB2 </a>

                <a ui-sref="dashboards.thirdTab" ui-sref-active="active" class="list-group-item" id="thirdTab_button">
                    <i style="color:darkblue" class="fa fa-server"></i>&nbsp; TAB3 </a>

            </div>
        </div>
    </div>




<div ui-view class="col-xs-12">

            <div class="row">
                <div class="col-xs-12" ng-if="vm.isTabOneSelected">
                    <div ng-include src="'components/Cards/Tabs/TabOne/TabOne.html'"></div>
                </div>
            </div>

            <div class="row">
                <div class="col-xs-12" ng-if="vm.isTabTwoSelected">
                    <div ng-include src="'components/Cards/Tabs/TabTwo/TabTwo.html'"></div>
                </div>
            </div>

            <div class="row">
                <div class="col-xs-12" ng-if="vm.isTabThreeSelected">
                    <graph-panel  panel-title="TabThree {{vm.isTabThreeSelected}}" chart-config="vm.charts.TabOneChartSite"></graph-panel>
                </div>
            </div>

        </div>

【问题讨论】:

    标签: html angularjs angular-ui-router


    【解决方案1】:

    在每个控制器上,您可以将加载的数据缓存在服务中,当您加载控制器时,您将首先检查该服务是否没有数据,然后您将从您的 API 请求它,在这种情况下您只有在第一次访问该选项卡时才请求您的数据:

    例如。您的服务

    app.service('dataService', function() {
    
        this.firstTabData =  null;
    
        this.getFirstTabData = function () {
            return this.firstTabData;
        };
    
        this.setFirstTabData = function (data) {
            this.firstTabData = data;
        };
    });
    

    你的控制器

    app.controller('tabOne', function($scope, dataService) {
        $scope.data = {};
    
        $scope.load = function () {
            if(dataService.getFirstTabData()) {
                $scope.data = dataService.getFirstTabData();
            }
            else {
                $scope.data = getDataFromAPI();
            }
    
        };
    
        var getDataFromAPI = function () {
             //get your data 
    
             dataService.setFirstTabData(dataFromAPI);
        };
    
    
    });
    

    【讨论】:

    • 非常感谢您的建议,让我检查一下这个选项,如果效果好我会将其标记为已解决,以便其他人能够使用此方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2014-07-14
    相关资源
    最近更新 更多