AngularJS orderBy问题

时间:2017-05-09 03:31:29

标签: javascript angularjs

抱歉,如果这听起来很愚蠢。

我遇到类似于this question的问题,虽然接受的答案有效,但它也提出了另一个问题:当我向数组添加新对象时,Angular不会渲染它

  app.controller('MainCtrl', [
    '$scope',
    '$filter',
    'posts',
    function($scope, $filter, posts) {
      $scope.posts = $filter('orderBy')(posts.posts, '-votes')
    }
  ]

我的添加功能:

    o.addPost = function(post) {
        return $http.post('/posts', post).success(function(data) {
          o.posts.push(data)
        })
    }

我能做些什么吗?

编辑:我跟这个:

  o.addPost = function(post) {
      return $http.post('/posts', post)
  }

  app.controller('MainCtrl', [
    '$scope',
    '$filter',
    'posts',
    function($scope, $filter, posts) {
      $scope.posts = $filter('orderBy')(posts.posts, '-votes')

      $scope.addPost = function() {
        posts.addPost(param).then(function(response) {
        $scope.posts.push(response.data)
      })
    }
  ]

2 个答案:

答案 0 :(得分:4)

工厂中的

只返回http而不是解开工厂内的承诺

o.addPost = function(post) {
    return $http.post('/posts', post);
}

然后在工厂内调用addPost方法。并在promise中捕获promise。

app.controller('MainCtrl', [
    '$scope',
    '$filter',
    'posts',
    function($scope, $filter, posts) {
        var params = {};
        posts.addPost(params).then(function(data) {
            $scope.posts = $filter('orderBy')(data, '-votes')
        })

    }
])

答案 1 :(得分:4)

仅针对实例更改的角度触发器。如果您只是按pushsplice修改数组,则不会触发过滤器。

您可以通过以下方式为array提供新实例。

o.addPost = function(post) {
    return $http.post('/posts', post).success(function(data) {
      o.posts.push(data);
      o.posts = o.posts.slice();    // this will give array a new instance and fire the filter.
    })
}