2015-01-05 2 views
1

У меня есть два контроллера и один завод. Первый контроллер делает HTTP-запрос на сервер и возвращает строку, которую он записывает на фабрику. Затем второй контроллер должен быть обновлен новой строкой, чего не произойдет.Контроллер AngularJS не обновляется на заводе

соответствующий код:

... 
.factory('user', function() { 
    return { 
     name: {str: ''}, 
     passwordHashed: {str: ''}, 
     userType: {str: 'none'}, 
    }; 
}) 
.controller('nav', ['$scope', 'user', function($scope, user) { 
    $scope.allSites = [ 
     //example what a page looks like, i have several more pages and several more usertypes 
     {name: 'home', title: 'Home', allowed: ['none', 'admin']}, 
    ]; 
    $scope.allowedSites = []; //displayed in navigation 
    angular.forEach($scope.allSites, function(site) { 
     if(contains(site.allowed, user.userType.str) != -1) $scope.allowedSites.push(site); 
    }); 
}]) 
.controller('loginCTRL', ['$scope', '$http', 'user', function($scope, $http, user) { 
    $http.get('url').success(function(data) { 

     //some code 

     user.name.str = $scope.enteredUsername; 
     user.passwordHashed.str = $scope.passwordHashed; 
     user.userType.str = data; //admin 
    }); 
}); 

Это, как предполагается, регенерировать Навигационное каждый раз, когда изменяется UserType но после того, как Логин, например, ничего не происходит. Я обыскал вокруг, и некоторые сообщения говорят, что вы должны поместить строки в отдельные объекты, но это ничего не исправить. Я все еще держал его (все это {str: 'bla'}).

+0

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

+0

Я все еще не понимаю, что вы ожидаете от контроллера 'nav'. Вы говорите, что когда свойство 'userType' будет обновляться, вы ожидаете, что массив' allowedSites' должен автоматически изменяться и связываться? –

ответ

0

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

Это связано с механизмом впрыскивания зависимостей.

Ваш контроллер инициирует свое состояние только один раз. Если вы хотите обновить свое состояние, вы должны поместить связанный код в функцию refresh() и как-то вызвать его там, где ваша служба готова.

Есть несколько способов сделать это, вы можете посмотреть здесь, например: http://www.codeproject.com/Tips/773147/Communication-between-the-Controllers-in-AngularJS

+0

Спасибо, отлично работает! – LBBO

0

Глядя на ваш код здесь несколько советов о том, как это должно быть сделано:

  1. Использование $routeProvider с пользовательский атрибут, такой как «acl». Используйте для этого числовое значение.
  2. Использование:

    app.run(function ($rootScope, $location) { 
    
    $rootScope.$on('$routeChangeStart', function (event, nextRoute, currRoute) { 
    

    создать редирект перехватчик.

  3. Числовое значение Comparision для атрибута ACL: if (user.acl < route.acl)

Чистый и простой :)

BTW. Вы можете использовать $ watch в контроллере, чтобы наблюдать за изменениями на заводе и реагировать на них.

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