【发布时间】: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