2016-11-02 8 views
0

ユーザーが正常にログインすると、ログインからログアウトにテキストを変更して、URLを家からダッシュボードに変更したいと考えています。ファクトリ関数の状態変更でng-showが機能しない

$stateProvider.state('home',{url:'/',views:{'':{templateUrl:'./partials/home/home.tpl.html'},'[email protected]' {templateUrl:'./partials/navbar/navbar.tpl.html'},'[email protected]':{templateUrl:'./partials/sidebars/lsidebar.tpl.html'},'[email protected]'{templateUrl:'./partials/content/content.tpl.html'}},authenticate:false }) 
    .state('dashboard',{url:'/dashboard',views:{'':{templateUrl:'./partials/home/home.tpl.html'},'[email protected]':{templateUrl:'./partials/navbar/navbar.tpl.html'},[email protected]':  {templateUrl:'./partials/sidebars/lsidebar.tpl.html'},'[email protected]':{templateUrl:'./partials/dashboard/dashboard.tpl.html'}},authenticate:true}) 

サンプル出荷:

coreApp.factory('AuthFactory',function($http){ 

var obj={}; 
var isAuthenticated=false; 

obj.login=function(data){ 
    return $http.post('http://reqres.in/api/login',data); 
} 
obj.userInfo=function(){ 
    isAuthenticated=true; 
    return {name:'xyz',balance:'10.00'}; 
} 
obj.isAuthenticated=function(){ 
    return isAuthenticated; 
} 

return obj; }); 

HTML:

<a ui-sref='login' ng-show='!AuthFactory.isAuthenticated()'><i class="glyphicon glyphicon-off"></i> Sign in</a> 
    <a ui-sref='logout' ng-show='AuthFactory.isAuthenticated()'><i class="glyphicon glyphicon-off"></i>Logout </a> 

ブートストラップ:

.run(['$rootScope', '$state','$stateParams','AUTH_EVENTS','AuthFactory',function($rootScope, $state, $stateParams,AUTH_EVENTS,AuthFactory){ 
$rootScope.$state = $state; 
$rootScope.$stateParams = $stateParams; 

$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) { 

    if(toState.authenticate && !AuthFactory.isAuthenticated()) 
    { 
     $state.transitionTo("login"); 
     event.preventDefault(); 
    } 


    console.log("AuthFactory"+AuthFactory.isAuthenticated()); 
    }); 

    $rootScope.$on(AUTH_EVENTS.notAuthenticated,function(event){ 
    console.log('You not logged in'); 
    });}]); 

問題は、ユーザーが更新され、印刷物値のされてルートスコープに記録されますときですAuthFactory.isAuthenticat ed()をtrueとし、urlも変更していますが、lsidebar.tpl.htmlのテキストは変更されません。

$スコープがわかりました。$ applyはそれを行う方法です。しかし、私はそのような場合に正しい方法が混乱しているか、$ scopeを使用することは問題ありません。関数。

+0

あなたは私のソリューションを試しましたか? –

+0

@Dennisはいそれは役に立ちます – Vibhas

+0

あなたはそれを受け入れるのですか? –

答えて

2

テンプレートでサービスを直接使用することはできません。サービスは、Angularが信頼できる関数に注入する方法を知っているオブジェクトです。

つまり、サービスにリンクを付けてコントローラのスコープにサービスを挿入し、プロパティを定義して、テンプレートでそのサービスを使用できるようにする必要があります。

JS

app.controller('myController', ['$scope', 'myService', function ($scope, myService) { 
    $scope.myService = myService; 
}); 

HTML

<div ng-controller="myController">{{ myService.someGetterFn() }}</div> 

それとも

JS

app.controller('myController', ['myService', function (myService) { 
    this.myService = myService; 
}); 

HTML

<div ng-controller="myController as ctrl">{{ ctrl.myService.someGetterFn() }}</div> 
0

AngularJSは、インライン式を扱うときに少し混乱します。場合例えば(

$scope.$apply(aaa = true); 

が、これがすべての状況で呼び出すことができないことに注意してください。また

ng-show="(!AuthFactory.isAuthenticated())" 

、および$apply()に関連して、(ただし常に適用されません)それを使用する方法は次のとおりです。試してみてくださいAngularがダイジェストの変更中に呼び出されると、エラーメッセージが表示されます)。

+0

問題は表現式ではないと思います。角度表現では、その値が変更されていることを認識しません。 – Vibhas

+0

値が変更されたときに、**既知の** **をAngularにすると(例えば '$ scope.MyFont = function(...) 'と宣言すると、Angularは知っているでしょう。必要となるだろう。 – FDavidov

+0

実際には、そのテンプレートに割り当てられているコントローラーがないため、私が工場やサービスでそれをやりたがっている理由がわかっています。私はいつでもどこでも使うことができます。 – Vibhas

関連する問題