2015-12-08 27 views
0

我使用的UI,路由器和嘗試將指令內訪問我的web應用程序的當前狀態,使用以下:訪問指令中的當前狀態名稱?

footer.directive.js

(function() { 
    'use strict'; 

    angular 
    .module('app') 
    .directive('myFooter', myFooter); 

    myFooter.$inject = ['$cookies', 'userFactory', '$state', '$log', '$rootScope']; 

    function myFooter($cookies, userFactory, $state, $log, $rootScope) { 
    var directive = { 
     restrict: 'E', 
     templateUrl: 'app/components/footer/footer.html', 
     controller: FooterController, 
     controllerAs: 'vm', 
     bindToController: true 
    }; 

    return directive; 

    function FooterController($state) { 
     var vm = this; 

     vm.currentState = $state; 
    } 
    } 

})(); 

footer.html

<div class="footer"> 
    <p>{{ vm.currentState.current.name }}</p> 
</div> 

當我運行$log.log($state)它在我的控制檯發佈一個對象,其中有一個current對象的name屬性等於我需要的狀態名稱,但是當我嘗試引用$ state.current.name時,無論是在我的視圖還是將它記錄到控制檯,它都顯示爲空字符串。

我對Angular有點新,所以如果有人能向我解釋這裏發生了什麼,或者至少如何解決這個問題,以便我能夠正確顯示我想要的東西,這將是一個巨大的幫助。謝謝!

編輯:我看了張貼這一個先於其他兩個問題是:

This one這似乎與基於狀態的名稱更改類名來處理更多,this one,這並不完全解決我的問題或者(和看起來並不像它可能是這樣做的正確方法。)

回答

0

首先,有一個命名錯誤在你發佈的代碼! (amaiFooter)

第二件事是,如果你登錄一個對象,它是通過調用約束引用

所以,你登錄的那一刻,您登錄參考。這意味着,當你看它,它可以包含比當你登錄它

但是,當你登錄狀態的名字,它是不確定的,這是正確的輸出其它值!

你可以嘗試用0延遲來包裝它在$超時功能,只爲你的代碼添加到當前的結束消化週期,這應該解決您的問題

+0

對不起,命名錯誤是由於它削減到一個MVP,我剛剛修復它。另外,是不是'vm.currentState'也是該對象的引用?所以當我在部分上執行vm.currentState.current.name時,爲什麼沒有正確顯示呢? – turner

+0

我想一個更重要的問題是,爲什麼這個工作正常,在我的控制器中沒有問題,但是這個指令控制器不能像這樣工作? – turner

0

需要注入的狀態服務控制器如下

(function() { 
    'use strict'; 

    angular 
    .module('app') 
    .directive('myFooter', myFooter); 

    myFooter.$inject = ['$cookies', 'userFactory', '$state', '$log', '$rootScope']; 

    function myFooter($cookies, userFactory, $state, $log, $rootScope) { 
    var directive = { 
     restrict: 'E', 
     templateUrl: 'app/components/footer/footer.html', 
     controller: FooterController, 
     controllerAs: 'vm', 
     bindToController: true 
    }; 

    return directive; 
    } 

    FooterController.$inject = ['$state']; 
    function FooterController($state) { 
    var vm = this; 

    vm.currentState = $state; 
    } 

})();