1

Я использую ng-token-auth и разрабатываю токен-auth.

Когда пользователь получает вошел в нем хранятся user.id в $ rootScope

это мой контроллер

app.controller('MyCtrl', function($rootScope,MyFactory){ 
    console.log($rootScope); 
    console.log($rootScope.user.id); 
}) 

Выход для первого является:

Объект {$ ID: 1 , $$ childTail: Object, $$ childHead: Object, $$ prevSibling: null, $$ nextSibling: null ...}
Выход для второго:
undefined

Но когда мы расширим первый выход содержит user.id
пользователя: Объект
configName: "по умолчанию"
электронной почты: "[email protected]"
ID: 3
поставщика: «электронная почта "
signedIn: истинный
статус: нулевой
UID: "17d851ed-4"
прото: Объект

+0

Где код хранения пользовательских данных в контроллере? Похоже, вы просто назначаете это неправильно. –

+0

Devise gem назначает атрибуты пользователя для корневого каталога. Я не знаю, как это делается. – user6706

ответ

0

Причина может заключаться в том, что вы пытаетесь получить доступ к свойству, которое не назначено YET (может быть, обещание разрешено или что-то в этом роде).

Чтобы убедиться, просто добавьте оператор debugger в свой контроллер, а затем посмотрите, действительно ли в данный момент находится свойство user.


отложить действие, которое будет использовать эту user.id, попробуйте следующее:

app.controller('MyCtrl', function($rootScope, MyFactory) { 
    var unwatch = $rootScope.$watch('user.id', function (id) { 
    if (angular.isDefined(id) { 
     // use the ID, as it seems to be defined now 
     console.log(id); 

     // remove the watch, because there's no more use for it 
     unwatch(); 
    } 
    }); 
}); 

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

app.service('getUserID', function($rootScope, $q) { 
    var deferred = $q.defer(); 

    var unwatch = $rootScope.$watch('user.id', function (id) { 
    if (angular.isDefined(id) { 
     // resolve the promise, as it seems to be defined now 
     deferred.resolve(id); 

     // remove the watch, because there's no more use for it 
     unwatch(); 
    } 
    }); 

    return function() { 
    return deferred.promise; 
    } 
}); 

// let's use it: 
app.controller('MyCtrl', function(getUserID) { 
    // value returned from this service is a promise that will be resolved with user.id 
    getUserID().then(function (id) { 
    // use the id 
    }); 
}); 
+0

Я получаю значение user.id i разметки вроде этого {{user.id}}, но не в контроллере – user6706

+0

Я предполагаю, что он обновляется на более позднем этапе. попробуйте добавить это утверждение в свой контроллер: 'console.log (angular.copy ($ rootScope.user)); ' –

+0

Он дает пустой объект Object {} – user6706

0

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

0

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

$ rootScope.user = {}; $ rootScope.user.id = test;

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