2016-09-13 2 views
1

Я пытаюсь создать страницу пользователя, где он показывает основные данные, данные, адрес и т. Д. Когда я делаю первую загрузку, она не отображается на пока я не изменю страницу и не вернусь на страницу пользователя. Это проблема из-за обещания вернуться после того, как я уже пошел на эту страницу.Значение контроллера AngularJs не обновляется после разрешения на заводе

я не могу (не хочу) использовать эти данные будут загружены во время resolve на stateChange, потому что это делает приложение чувствует замораживания, так как это будет только изменить экран после того, как все данные resolved, и если это занимает некоторое время, кажется, что страница не работает.

Я также попытался с помощью $scope.$digest() (на controller) и $rootScope.$apply() на factory, но обе ситуации дают мне ошибку digest running.

Использование .then() не является вариантом (если только не существует надлежащего способа), потому что, если я вернусь на эту страницу после первой загрузки, будут ошибки.

Путь я загружаю это от parent (реферата) controller и хранения этих значений в factory, что-то вроде этого:

//Parent Controller 
function parentController(requestFactory, storeFactory, $q) { 
    var 
     user = storeFactory.userGet(), 
     data = storeFactory.dataGet() 
     [...more load...]; 

    if(!user || !data ...) { 
     var promises = { 
      user: requestFactory.get('userGet'), 
      data: requestFactory.get('dataGet'), 
      [...more requests...] 
     }; 

     return $q.all(promises).then(function(resolve){ 
      storeFactory.userAdd(resolve.user); 
      storeFactory.dataAdd(resolve.data); 
      [...more update...] 
     }); 
    } 
} 

//Factory 
function storeFactory() { 
    var 
     data = null, 
     user = null, 
     address = null, 
     endereco = null; 

    var service = { 
     userGet: _userGet, 
     userAdd: _userAdd, 
     [...more definitions...] 
    }; 
    return service; 


    function _userGet() { 
     return user; 
    } 
    function _userAdd(data) { 
     return user = data; 
    } 
    [...more functions...] 
} 

// child Controller 01 
function child1Controller(storeFactory) { 
    vm.user = storeFactory.userGet(); 
} 

// child Controller 02 
function child2Controller(storeFactory) { 
    vm.address = storeFactory.addressGet(); 
} 

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


Итак, если доступ пользователю страницу > адрес он не показывает ничего на экран, но если я перейду на другую страницу и вернусь, все будет выглядеть так, как должно быть показано.

Есть ли способ решить эту проблему? Автоматическое обновление данных?

+1

Если вы используете ui-router, вы можете выполнить обещания до того, как произойдет переход состояния, поэтому данные будут там. В противном случае просто подождите, пока обещания будут разрешаться в контроллере и обновить пользовательский интерфейс соответственно. – reptilicus

+0

@reptilicus. Но я не хочу использовать его в решении ui-router, потому что он чувствует, что страница не работает, так как она изменится только после данные разрешаются, что может занять некоторое время. При использовании разрешения на контроллере у меня возникают проблемы с обновлением ui после решения. – celsomtrindade

+0

Хорошо, если вы ждете множества обещаний решить, тогда да, это займет некоторое время. Либо разбить обещания на группы, которые могут быть использованы для обновления пользовательского интерфейса или найти способ сделать меньше запросов? – reptilicus

ответ

0

Способ, которым я мог решить эту проблему, состоял в том, чтобы создать единый объект с вложенными массивами на заводе вместо создания нескольких массивов. Кроме того, в контроллере я не могу установить конкретный массив прямо в vm, мне нужно установить массив внутри объекта, таким образом он автоматически обновляется.

//Factory 
var data = { 
    user: null, 
    address: null, 
    [...] 
}; 

function _userAdd(value) { 
    return data.user = value; 
} 
[...etc...] 

//Controller 
function child1Controller(storeFactory) { 
    vm.maindata = storeFactory.data; 
} 

После этого, мне нужно указать вложенный массив на представлении, как это:

<p>{{vm.maindata.user}}</p> 

<ul> 
    <li ng-repeat="address in vm.maindata.address track by $index">{{address}}</li> 
</ul> 

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