AngularJS中视图中的动态orderBy Breaks ng repeat

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

我通过控制器中的服务动态排序数据时遇到问题。当我进行初始搜索时,数据加载很好,但一旦我尝试更新orderBy,视图中的所有数据都将消失,而不是重新排序。我在视图中显示的数据是存储在$scope.filtered\u事件中的数据。此外,我的控制器通过路由器连接到模板

搜索控制器

(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
    ]