2016-01-09 34 views
-1

我不想基於codeigniter中的會話狀態動態顯示菜單項。讓我告訴你我的代碼,下面的解釋。使用Angular和Codeigniter更改基於會話值的菜單

這是我的index.html文件

    <li><p ng-bind-html="link1" ></p></li> 
        <li><p ng-bind-html="link2" ></p></li> 

到鏈路數據出來這個控制器

sessionFactory.isLoggedIn().then(function(data){ 
    var loggedIn = data.logged_in; 
    if(loggedIn == true){ 
     $scope.link1 = $sce.trustAsHtml('<a href="#/my_profile">My profile</a>'); 
     $scope.link2 = $sce.trustAsHtml('<a ng-click="logOut()" style=\"cursor: pointer;" >Logout</a>'); 
    }else{ 
     $scope.link1 = $sce.trustAsHtml('<a href="#/login">Login</a>'); 
     $scope.link2 = $sce.trustAsHtml('<a href="#/register" >Register</a>'); 
    } 
}) 

的這是我的會話工廠

//Factory for Session 
app.factory('sessionFactory', ['$http', '$location', function($http, $location){ 
    var factory = {}; 

    factory.logOutUser = function(){ 
     console.log("woot"); 
     return $http({ 
      method: 'POST', 
      url: $location.protocol() + '://' + $location.host() + '/server/api/users/logout' 
     }).then(function successCallback(response) { 
      console.log(response); 
     },function errorCallback(response) { 
      console.log('error logging out: ' + response); 
     }); 
    } 

    factory.isLoggedIn = function(){ 
     console.log("checking login"); 
     return $http({ 
      method: 'GET', 
      url: $location.protocol() + '://' + $location.host() + '/server/api/users/isLoggedIn' 
     }).then(function successCallback(response) { 
      console.log(response.data); 
      return response.data; 
     },function errorCallback(response) { 
      console.log('Checking login failed: ' + response); 
     }); 
    } 

    /* 
    /server/api/users/logoutfactory.currentUserId = function(){ 
     return $http.get($location.protocol() + '://' + $location.host() + '/server/api/users/userId'); 
    } 
    */ 
    return factory; 
}]); 

阿比/server/api/users/isLoggedIn回報

{"success":true,"logged_in":true} 

{"success":true,"logged_in":false} 

所以我要的是,當用戶登錄或註銷<li></li>項目不改的問題。我必須按f5刷新網頁。
如果您需要任何其他信息,請讓我知道,我會提供。

預先感謝您。

+1

,而不是插入HTML,爲什麼沒有出現所有的鏈接默認情況下,並設置一個布爾值與會話,並使用內置dirctives爲'angulars納克只顯示是否有真值。 –

+0

你能提供jsfiddle/plunker嗎? – Nora

+0

@JoeLloyd是的,我改變了它,我在想這可能是這個問題。 –

回答

1

你可以在你的會話工廠解僱與

$rootScope.$emit("authenticationChanged") 

$rootScope事件當用戶登錄和退出,然後在控制器運行

function checkIfLogged() { 
 
    var loggedIn = data.logged_in; 
 
    if (loggedIn == true) { 
 
    $scope.link1 = $sce.trustAsHtml('<a href="#/my_profile">My profile</a>'); 
 
    $scope.link2 = $sce.trustAsHtml('<a ng-click="logOut()" style=\"cursor: pointer;" >Logout</a>'); 
 
    } else { 
 
    $scope.link1 = $sce.trustAsHtml('<a href="#/login">Login</a>'); 
 
    $scope.link2 = $sce.trustAsHtml('<a href="#/register" >Register</a>'); 
 
    } 
 
} 
 
checkIfLogged(); //RUN THE FIRST TIME THE PAGE LOADS 
 

 
$rootScope.$on("authenticationChanged", function(){ 
 
    checkIfLogged(); //RUN WHEN AUTHENTICATION CHANGE 
 
});

有關事件檢查的更多信息,請參閱https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope

+0

不要使用'$ rootScope'這種類型的東西。全局變量有時間和地點,但這不是那個時代。 –

+0

這不是全局變量。這是一個全球性的事件..它需要從應用程序的所有應用程序從服務到控制器 –

+0

我試過但它沒有幫助。可能是因爲我很不理解代碼。我會繼續嘗試 –

1

您可以嘗試使用功能,讓鏈接內容:

<li><p ng-bind-html="getLink1Content(false)"></p></li> 
<li><p ng-bind-html="getLink2Content(false)"></p></li> 

$scope.getLink1Content = function (loggedIn) { 
    var linkContent = loggedIn ? '<a href="#/my_profile">My profile</a>' : '<a href="#/login">Login</a>'; 

    return linkContent; 
}; 

$scope.getLink2Content = function (loggedIn) { 
    var linkContent = loggedIn '<a ng-click="logOut()" style=\"cursor: pointer;" >Logout</a>' : '<a href="#/register" >Register</a>'; 

    return linkContent; 
} 

sessionFactory.isLoggedIn().then(function(data){ 
    var loggedIn = data.logged_in; 

    $scope.getLink1Content(loggedIn); 
    $scope.getLink2Content(loggedIn); 
}); 
+0

對不起,我有一些情人回來的問題。當我會變得更好時,我會重新嘗試一切。 –