2015-09-15 3 views
0

У меня есть массив сообщений в блоге на моем контроллере, и каждый раз, когда я обновляю массив, я хочу, чтобы представление изменилось соответствующим образом.

Это частичное HTML (Единственное, что отношение является то, что я использую нг-повтор):

<div ng-repeat="blog in blogCtrl.blogs"> 
    <blog author="blog.author" title="blog.title" content="blog.content"></blog>  
    <button ng-click="blogCtrl.like(blog._id)" class="btn btn-info glyphicon glyphicon-thumbs-up">{{blog.likes}}</button> 
    <button ng-click="blogCtrl.remove()" class="btn btn-danger glyphicon glyphicon-remove"></button> 
</div> 

Это мой контроллер:

like(blogId){ 
     this.BlogsDao.like(blogId).then(response => { 
      // replacing the old blog with the updated one 
      this.$scope.$apply(function(){ 
       var itemIndex = _.findIndex(this.blogs, function(item){ 
        return item._id === blogId; 
       }); 
       this.blogs.splice(itemIndex, 1, response.data); 
      }); 

     }); 
    } 

Теперь, когда я нажав на кнопку типа, которая запускает аналогичную функцию на моем контроллере.

выход консоли:

Error: [$rootScope:inprog] $digest already in progress 
http://errors.angularjs.org/1.4.5/$rootScope/inprog?p0=%24digest 
    at REGEX_STRING_REGEXP (angular.js:68) 
    at beginPhase (angular.js:16235) 
    at Scope.parent.$get.Scope.$apply (angular.js:15976) 
    at blogs.ctrl.js:22 
    at processQueue (angular.js:14634) 
    at angular.js:14650 
    at Scope.parent.$get.Scope.$eval (angular.js:15878) 
    at Scope.parent.$get.Scope.$digest (angular.js:15689) 
    at Scope.parent.$get.Scope.$apply (angular.js:15986) 
    at done (angular.js:10511) 

Я искал решения на другие должности, но хотя есть много сообщений по этому вопросу, никто не дал свою подсказку о том, что происходит здесь.

Что я делаю неправильно?

+2

Почему бы вам нужно даже '$ $ apply' сфера в контроллере.? Должно ли AngularJS обновлять его автоматически? – DanEEStar

+0

На самом деле вы правы. Пробовал это снова без $ apply и ng-repeat был соответствующим образом изменен. Благодаря! – Shikloshi

ответ

0

Вы можете проверить, выполняется ли $ digest, проверяя $ scope. $$ phase.

Попробуйте это

if(!$scope.$$phase) { 
     this.$scope.$apply(function(){ 
        var itemIndex = _.findIndex(this.blogs, function(item){ 
         return item._id === blogId; 
        }); 
        this.blogs.splice(itemIndex, 1, response.data); 
       }); 

    } 

Более подробную информацию, пожалуйста, проверка этой дискуссии: AngularJS : Prevent error $digest already in progress when calling $scope.$apply()

+1

его антипаттерн https://github.com/angular/angular.js/wiki/Anti-Patterns, вы можете добавить примечание .. или предпочитаете использовать '$ timeout' –

Смежные вопросы