【问题标题】:AngularJS : Refreshing data in view on click of tabsAngularJS:单击选项卡时刷新视图中的数据
【发布时间】:2016-05-07 19:19:15
【问题描述】:

我是 Angular 的新手,所以请原谅我的无知!

我有一个页面,其中包含三个选项卡(使用 Angular Material 作为选项卡)显示记录列表。但是,每个选项卡都必须显示不同的记录(例如,打开选项卡必须显示处于“打开”状态的记录,关闭必须显示处于“关闭”状态的记录等等):

<div ng-controller="SomeController as someCtrl">
<md-content>
    <md-tabs>
        <md-tab id="tab1" >
            <md-tab-label>OPEN</md-tab-label>
            <md-tab-body>                
                <div ng-view></div>
            </md-tab-body>
        </md-tab>
        <md-tab id="tab2" md-on-select="someCtrl.showTaskListing('Error')">
            <md-tab-label>EXCEPTIONS</md-tab-label>
            <md-tab-body>
                <div ng-view></div>
            </md-tab-body>
        </md-tab>
        <md-tab id="tab3" md-on-select="someCtrl.showTaskListing('Closed')">
            <md-tab-label>CLOSED</md-tab-label>
            <md-tab-body>
                <div ng-view></div>
            </md-tab-body>
        </md-tab>
    </md-tabs>
</md-content>
</div>

这是我的控制器(RequestSenderService 只是一个用于执行 $http 操作的实用服务):

angular
    .module('SomeModule')
    .controller('SomeController', someController);

function SomeController($scope, $location, $http, RequestSenderService) {

    showTaskListing('Incomplete');

    function showTaskListing(status) {

        var httpResponsePromise = RequestSenderService.sendRequest("/getTasks?status=" + status);

        httpResponsePromise.then(
            function (response) {
                setTimeout(function () {
                    $scope.$apply(function () {
                            $scope.tasks = response.data;
                            for (task in this.tasks) {
                                task.isSelected = true;
                            }
                        }
                    )
                }, 1000);
            }
        )
    }

这是路由配置:

angular.module("SomeModule",["ngRoute","ngMaterial"])
    .config(function($routeProvider){
        $routeProvider
            .when("/tasks", {
                templateUrl : "js/tasklist/tasklist.partial.html",
                controller : "SomeController as someCtrl"
            })
            .when("/addTask", {
                templateUrl : "js/taskDetails.partial.html",
                controller : "AnotherController as anotherCtrl"
            })
            .otherwise( {
                redirectTo : "/tasks"
            })

    }) ;

最后这是我的模板:

<div>
    <table style="width:100%">
        <tr>                
            <th>Task Name</th>
            <th>Description</th>
            <th>Type</th>
        </tr>

        <tr ng-repeat="task in tasks">                
            <td ng-bind="task.title"></td>
            <td ng-bind="task.description"></td>
            <td ng-bind="task.type"></td>
        </tr>
    </table>
</div>

现在,当我加载页面 (/tasks) 时,数据在第一个选项卡上加载正常,但它也在其他两个选项卡上加载相同的数据,即使我在每个选项卡和函数上都给出了 md-on-select调用正常,但页面上的数据没有刷新。

有人可以帮忙吗?谢谢。

【问题讨论】:

  • 为什么在承诺响应处理程序中使用超时?
  • 只需在 httpResponsePromise 行之后和 for 循环内部/之后添加一个 console.log() 以查看您的 showTaskListing 方法是否被调用,或者如果是那么结果是什么你得到。如果方法没有被调用,那么我们需要改变设置的方式,如果结果相同,那么你的后端需要改变。执行并检查您的浏览器控制台
  • @mindparse 超时用于使用 $scope.apply()
  • @XavitojCheema 正在调用该方法,并且来自后端的数据也是正确的。我在发布时剥离了 console.logs,这样代码就不会那么冗长了!

标签: javascript angularjs angular-material


【解决方案1】:

您好,我刚刚看了一个 Angular 材质选项卡演示,并根据您的需要对其进行了修改,这是link

你只需要修改

$scope.selectedTab = function(index) {
    // your httpResponsePromise
}

它应该可以工作,只需忽略 css 部分,它只是从 angular material demo 复制的代码,你只需要按照我的方式设置你的 html 和 js。

基本上md-on-select 是在单击时评估的表达式,而不是事件处理程序。所以你必须保存md-on-select="result = selectedTab()",然后把{{result}}放到你的模板中。

【讨论】:

  • 非常感谢!!更改功能以使用范围使其工作!
  • 您的意思是在范围内定义时调用 showTaskListingsomeCtrl.showTaskLisiting 使其工作?
  • 是的。这是我现在的功能:$scope.showOpenTasks = function () { $location.path('/tasks'); showTaskListing('Open'); }
猜你喜欢
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
相关资源
最近更新 更多