2016-03-13 5 views
3

Я ударил головой по поводу проблемы с угловым значением JS $. У меня есть массив, который я обновляю в функции контроллера. Согласно моим журналам консоли, значения внутри него действительно изменены. Однако представление не обновляется. Вот фрагменты.

//array initialisation 

    $scope.fieldSuggestions = [] 

//modifying function 

    $scope.changeCurrentInput = function(fieldName, eye) { 
    for(var field in $scope.test){ 
     console.log($scope.test[field].name) 
     if($scope.test[field].name === fieldName){ 
     console.log($scope.test[field].values) 
     console.log("be4 update") 
     console.log($scope.fieldSuggestions) 
     $scope.fieldSuggestions = $scope.test[field].values; 
     console.log("after update") 
     console.log($scope.fieldSuggestions) 
     } 
    } 
    }; 

//view 

<div ng-repeat="choice in fieldSuggestions">  
    <button class="button button-positive">{{choice}}</button> 
</div> 

ПОДРОБНЕЕ ...

Я думаю, что это может быть уместным. У меня есть родительское представление и несколько дочерних представлений. Каждый из этих маршрутов использует один и тот же контроллер. i.e: контроллер свойств в routes.js одинаковый для всех. Кнопка, вызывающая функцию изменения, находится в дочерних представлениях, но ng-repeat, который не обновляется, находится в родительском представлении.

+0

Что произойдет, если вы нажмете или соединитесь в списке? Обновляется ли представление? – Patrick

+0

@Patrick no view не обновляется нажатием. – tarball111

+0

Вы меняете значение в цикле дайджеста? Как и когда вы вызываете функцию? – Patrick

ответ

0

Оказывается, я затенял родительскую переменную fieldSuggestions, объявив, что мои дочерние контроллеры являются тем же, что и родительский. Решение заключалось в том, чтобы не обновлять контроллер на дочерних маршрутах, поскольку он автоматически видит родительский.

Спасибо всем, кто помогал.

1

Из-за того, что вы меняете вложенные свойства Угловые не вызывают дайджесты. Вы можете просто исправить, добавив в link или controller функции:

$scope.$watchCollection('fieldSuggestions', function(newFieldSuggestions, oldFieldSuggestions) { 
    $scope.fieldSuggestions= newFieldSuggestions; 
}); 

вещей указать: Это может быть не самым оптимальным для больших коллекций и сложных объектов.

+0

Где я могу добавить это? Пробовал несколько мест без успеха. И вы уверены, что я «изменяю вложенные свойства»? Я не изменяю $ scope.test, я изменяю $ scope.fieldSuggestions. – tarball111

+0

Внутри вашей функции 'controller' /' link' в директиве. – masterspambot

+0

благодарим вас за ваше время, но он, похоже, не работает. Я добавил его в свои функции контроллера. сразу после angular.module ('examWriteCtrl', []). controller ('examWriteCtrl', ['$ scope', ... – tarball111

0

Я думаю, что из-за изменения вложенности он не может обновить значение в это время. Вы можете использовать $ scope. $ Apply(), чтобы получить последнее обновленное значение Как .... $ scope. $ Apply ($ scope.fieldSuggestions = $ scope.test [field] .values);

+0

Я получаю $ apply уже в вашей линии. – tarball111