AngularJS中视图中的动态orderBy Breaks ng repeat
我通过控制器中的服务动态排序数据时遇到问题。当我进行初始搜索时,数据加载很好,但一旦我尝试更新orderBy,视图中的所有数据都将消失,而不是重新排序。我在视图中显示的数据是存储在$scope.filtered\u事件中的数据。此外,我的控制器通过路由器连接到模板 搜索控制器AngularJS中视图中的动态orderBy Breaks ng repeat,angularjs,angularjs-scope,angularjs-ng-repeat,angularjs-service,angularjs-orderby,Angularjs,Angularjs Scope,Angularjs Ng Repeat,Angularjs Service,Angularjs Orderby,我通过控制器中的服务动态排序数据时遇到问题。当我进行初始搜索时,数据加载很好,但一旦我尝试更新orderBy,视图中的所有数据都将消失,而不是重新排序。我在视图中显示的数据是存储在$scope.filtered\u事件中的数据。此外,我的控制器通过路由器连接到模板 搜索控制器 (function () { .controller("Search", function ($scope, zipcodeSvc, $filter, $http) { $scope.$on("s
(function () {
.controller("Search", function ($scope, zipcodeSvc, $filter, $http) {
$scope.$on("search", search);
$scope.sortBy = "date";
function search(evt, data) {
$scope.zip_codes = [];
$scope.locations = null;
$scope.response = null;
$scope.events = null;
zipcodeSvc.find(data.str, data.dist)
.then(
function (response) {
$scope.locations = response;
for(i=0; i<$scope.locations.zip_codes.length; i++){
$scope.zip_codes.push($scope.locations.zip_codes[i].zip_code);
}
console.log($scope.zip_codes);
$http.get("api/events")
.success(function(response){
$scope.events = response;
//what I want to be able to dynamically order
$scope.filtered_events = $filter('eventsInRange')($scope.events, $scope.zip_codes);
});
},
function (err) {
console.log("error finding cities: ", err);
}
)
}
})
.filter("eventsInRange", function () {
return function(events, zipcodes) {
events_in_range = [];
for(i=0;i < events.length; i++){
if(zipcodes.indexOf(events[i].location.zip_code) > -1){
events_in_range.push(events[i])
}
}
return events_in_range;
}
});
}());
编辑-添加了$scope.filtered\u事件的数据结构:
[
{ date: "mm/dd/yyyy",
location: {
address: "Someplace",
city: "Some city",
zip_code: "12345",
name: "Some Name",
state: "Some State"
},
time: "hh:mm AM",
type: "Some type",
created_by: "Some person"
},
//etc
]
我怀疑问题在于您的orderBy
筛选器没有更新您的$scope.filtered\u事件
绑定。当您直接在success
回调中添加$filter('orderBy')($scope.filtered\u events,'type')
时,一切正常工作的原因是$scope.$apply()
正在为您隐式调用
要修复此问题,请在orderBy
函数的末尾添加$scope.$apply()
请参阅以获取快速解释 我怀疑问题在于您的orderBy
筛选器没有更新您的$scope.filtered\u事件
绑定。当您直接在success
回调中添加$filter('orderBy')($scope.filtered\u events,'type')
时,一切正常工作的原因是$scope.$apply()
正在为您隐式调用
要修复此问题,请在orderBy
函数的末尾添加$scope.$apply()
请参阅以获取快速解释 请展示数组过滤的\u事件
的样子-在类似这样的问题中,它比查看如何获得它更重要。如果您要硬编码数据,它是否也会过滤?[{“日期”:“mm/dd/yyyy”,“位置”:{“地址”:“某地”,“城市”:“某地”,“邮编”:“12345”,“姓名”:“某地名”,“州”:“某地州”},“时间”:“hh:mm AM”,“类型”:“某类型”、“创建人”:“某个人”}等]
如果我将信息直接从服务外部导入控制器中的一个变量,则该信息会起作用,但一旦我将所有内容移动到一个函数中以使用该服务获取数据,我使用的orderBy方法就会导致页面空白。如果我在成功调用中设置筛选器,$filter('orderBy'))($scope.filtered_事件,'type')
它将在首次加载时正确执行orderBy。它适用于异步数据:。但是,我删除了cyaFilter
,因为它没有定义-可能是导致问题的原因。请显示数组筛选的\u事件
的外观-在类似这样的问题中,它比查看如何更重要你正在得到它。如果你硬编码数据,它也会过滤吗?[{“日期”:“mm/dd/yyyy”,“位置”:{“地址”:“某地”,“城市”:“某地”,“邮编”:“12345”,“姓名”:“某地”,“州”:“某地”},“时间”:“hh:mm AM”“,”类型“:”某些类型“,”创建人“:”某些人“}等]
如果我将信息直接从服务外部导入控制器中的一个变量,则该信息会起作用,但一旦我将所有内容移动到一个函数中以使用该服务获取数据,我使用的orderBy方法就会导致页面空白。如果我在成功调用中设置筛选器,$filter('orderBy'))($scope.filtered_事件,'type')
它将在首次加载时正确执行orderBy。它适用于异步数据:。但是,我删除了cyaFilter
,因为它没有定义-可能是导致问题的原因。请显示数组筛选的\u事件
的外观-在类似这样的问题中,它比查看如何更重要您正在获取它。如果您硬编码数据,它是否也会过滤?[{“日期”:“mm/dd/yyyy”,“位置”:{“地址”:“某地”,“城市”:“某地”,“邮编”:“12345”,“姓名”:“某地”,“州”:“某地”},“时间”:“hh:mm AM”,“类型”:“某些类型”,“创建人”:“某些人”}等]
如果我将信息直接从服务外部导入控制器中的一个变量,则该信息会起作用,但一旦我将所有内容移动到一个函数中以使用该服务获取数据,我使用的orderBy方法就会导致页面空白。如果我在成功调用中设置筛选器,$filter('orderBy'))($scope.filtered_事件,'type')
它将在首次加载orderBy时正确执行。它适用于异步数据:。但是,我删除了cyaFilter
,因为它没有定义-可能是导致问题的原因。现在在代码中,我正在通过更改视图s中的变量来更新orderBy
过滤器ortBy
在ng中单击
。因此,我没有在筛选器中使用函数。我只是在此处交换一个变量,该变量最初在控制器中设置,但随着单击而更改,例如此处
,因此我不清楚在何处添加$scope。$apply()。现在,在代码中,我通过在ng click
中的视图sortBy
中更改变量来更新orderBy
过滤器。因此,我没有在过滤器中使用函数。我只是在这里交换一个变量
,该变量最初在控制器中设置,但随单击而更改,例如她e
因此我不清楚在何处添加$scope.$apply()。现在在代码中,我正在通过更改
(function () {
angular.module("app.data")
.factory("zipcodeSvc", function ($http, $q) {
return {
find: findByLocation
}
function findByLocation(location, distance) {
var url = "api/zipcodes?location=" + location + "&distance=" + distance;
var defer = $q.defer();
$http.get(url)
.success(function (response) {
defer.resolve(response);
})
.error(function (err) {
defer.reject(err);
console.log(err);
})
return defer.promise;
}
});
}());
[
{ date: "mm/dd/yyyy",
location: {
address: "Someplace",
city: "Some city",
zip_code: "12345",
name: "Some Name",
state: "Some State"
},
time: "hh:mm AM",
type: "Some type",
created_by: "Some person"
},
//etc
]