我刚开始玩angularJS,所以也许我会问一些容易做的事,但我找不到办法去做。 情况如下:我有一个列表,由一个ng-repeat填充来自一个范围控制器变量的值。通过jsonp调用在页面加载时加载此变量,这很好。 当我需要根据另一个选择重新加载此列表时,问题就出现了。例如,如果在select中选择'day'值我需要显示一些值,当我选择'week'时我需要显示其他值(也通过ajax加载)。
我尝试过的是拥有一个加载数据并返回它的服务,并且在控制器中有两个方法,一个用于第一个加载,另一个用于第二个用于使用变量进行$ scope.apply的方法。然后我在选择值更改时调用第二个方法(我已经使用jquery完成它以简化它,直到我可以修复它)。
这是我的HTML
的一部分<div x-ng-controller='LeaderboardCtrl'>
<select id='leaderboard-select'>
<option value='day'>day</option>
<option value='week'>week</option>
<option value='month'>month</option>
</select>
<div x-ng-repeat='p in leaderboard'>
<p>{{p}}</p>
</div>
</div>
这是影响此功能的代码的一部分
var lead = angular.module("lead",[]);
function LeaderboardCtrl($scope,$attrs,$http,jtlanService) {
$scope.leaderboard = [];
$scope.period = 'day';
var data = {
period:$scope.period
};
$scope.loadLeaderboard = function(){
myService.loadLeaderboard(data).then(function(leaderboard) {
$scope.leaderboard = [];
$scope.leaderboard.push.apply($scope.leaderboard,leaderboard);
});
}
$scope.reloadLeaderboard = function() {
myService.loadLeaderboard(data).then(function(leaderboard) {
$scope.$apply(function() {
$scope.leaderboard = [];
$scope.leaderboard.push.apply($scope.leaderboard,leaderboard);
});
});
}
$scope.loadLeaderboard()
}
lead.service("myService",["$http", function($http) {
var myService = {
loadLeaderboard : function(data) {
var promise = $http.jsonp("/widget/leaderboardJSONP?callback=JSON_CALLBACK&_="+new Date(),{
params:data,
cache:false,
ajaxOptions: { cache: false }
}).then(function(response) {
return response.data;
});
return promise;
}
};
return myService;
}]);
$("#leaderboard-select").change(function(){
scope.period = $("#leaderboard-select").val();
scope.reloadLeaderboard();
});
以下是代码的小提琴:http://jsfiddle.net/WFGqN/3/
答案 0 :(得分:2)
你的小提琴充满了问题:
ng-app
$http.jsonp
调用不会按原样运行,但您可以使用echo服务(请参阅左侧的Ajax请求)来模拟请求ng-change
而不是$().change
(即使您使用jQuery进行事件绑定,也应该使用$().on('change')
)。$scope.$apply
函数中使用loadLeaderboard
,因为当您调用它时,您已经在$ apply通话中。这是一个解决问题的小提琴,我想你可以得到你想要的东西:http://jsfiddle.net/WFGqN/5/。你当然需要修改服务,但你明白了。
我建议阅读这个SO答案:"Thinking in AngularJS" if I have a jQuery background?