2015-05-02 3 views
-1

Я просматриваю список Jobs Нравится это (упрощен для демонстрации).Угловое наблюдение за функцией с значениями параметров

я могу получить доступ к информации из массива Jobs супер просто, как это (Job.Name, Job.Date и т.д.)

<div ng-repeat="(key, Job) in Jobs" ng-show="Job.Status=='Active'"> 
    <div class="newMessages"> 
     {{hasNewCreatorMessages(Job.$id)}} New Messages 
    </div> 
</div> 

Однако я создал функцию, чтобы подсчитать количество сообщений осталось на что работа, которую я доступ как переменная выше, здесь полная функция:

$scope.hasNewCreatorMessages = function(jobID) { 
     var numNewMessages = 0; 
     var messages = firebase.child('messages'); 
     messages.on('value', function(snap){ 
      snap.forEach(function(child){ 
       child.forEach(function(message){ 
        if(jobID == message.val().jobID && message.val().newCreatorMessage) { 
         numNewMessages += 1; 
        } 
       }); 
      }); 
     }); 
     console.log(numNewMessages); 
     return numNewMessages; 
    }; 

консоль выводит правильное количество новых сообщений (поэтому счетчик и функции работают правильно). Проблема в том, что в реальном представлении html он не обновляется, у меня есть ощущение, что оно связано с Angular Digest (что я не совсем понимаю). Иногда, когда я получаю доступ к странице из кеша, она работает правильно, но если я делаю жесткое обновление, она не отображает счет.

+0

Это довольно большой беспорядок. Вы используете AngularFire здесь? «$ Id» предлагает так. Где находится остальная часть кода, объясняющая, что такое Джобс и как оно создано. Здесь очень сложно предложить какой-либо осмысленный совет. См. [Создание mcve] (http://stackoverflow.com/help/mcve). – Kato

ответ

1

Ваша проблема заключается в том, что ваша функция $scope.hasNewCreatorMessages выполняется только тогда, когда dom анализируется угловым или когда обновляется $scope.Jobs (корневой объект, а не дети).

Для того, чтобы решить проблему, внутри контроллера, вы должны добавить $watch Wich будет вызывать функцию, которая будет обновлять массив внутри вашего $scope:

Внутри контроллера, когда он получает инстанциирован, вы делаете что-то как то:

$scope.arrayOfCounters = []; 

for (var i = 0; i< $scope.Jobs.length; i++){ 
    $scope.arrayOfCounters.push(integerCalculatedByAFunction); 
} 

Затем вы регистрируетесь часы на заданиях

$scope.watchCollection('Jobs.something.messages', function(){ 
    //Update your array here 

    //Do not $scope.arrayOfCounters = []; <= this creates a new reference and the view wont be updated. 
    // But do instead $scope.arrayOfCounters.length = 0; 
}); 

Извините за Ла ck объяснения вокруг watchCollection, я теперь он существует, но никогда не использовал его.

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