2014-07-02 36 views
1

我試圖在運行時更改父視圖模板 - 在服務中。Angular UI路由器在運行時替換視圖

我的應用程序的配置是這樣的:

$stateProvider 
.state('base', { 
    abstract: true, 
    views: { 
     'header':  { 
      controller: 'HeaderCtrl', 
      templateUrl: 'header.html' 
     }, 
     '': { 
      template: '<div ui-view="main"></div>' 
     } 
    } 
}) 
.state('base.home', { 
    url: '/', 
    views: { 
     'main': { 
      controller: 'SomeContentCtrl', 
      templateUrl: 'content.html' 
     } 
    } 
}); 

我再有一個是從SomeContentCtrl稱爲服務將偵聽一個事件,在這種情況下我想設置templateUrl頁眉爲空。例如:

angular 
    .module('RemoveTemplate', [ ]) 
    .factory('RemoveTemplate', ['$window', '$view', '$state', 
     function RemoveTemplate ($window, $view, $state) { 

      var windowElem = angular.element($window); 

      var listen = function () { 
       windowElem.on('RemoveTemplate', function (event) { 
        $view.load('[email protected]', { 
         templateUrl: null 
        }); 

        // Trying both, even tried without refreshing the state 
        $state.reload(); 
        $state.go('wh.lobby'); 
       }); 
      }; 

      return { 
       listen: listen 
      }; 

     } 
    ]); 
}); 

但是這根本不起作用。有沒有人遇到過類似的用例?

謝謝

回答

3

您可以指定每次導航到狀態時運行的templateURL函數。

https://github.com/angular-ui/ui-router/wiki/Quick-Reference#template-templateurl-templateprovider

這種方法可以檢查它是否應該提供一個網址或其他的什麼。 例如:

​​
+0

感謝您的回答。我不認爲這符合上面提供的要求,因爲它不允許在加載後更改模板。我對麼? – jribeiro

+0

這將適用於每個導航。 如果您想在常規運行時刪除模板,則可以隨時清空DOM元素。 – Rodik

0

如果你想「隱藏」而不刪除HTML嘗試使用NG秀指令標題標籤內,並檢查實際狀態的標頭部分。

<div ng-show="state.is('base')"> 

這樣你只需要在控制器中注入$ state服務。 當狀態是基地該div將顯示,如果您導航到子狀態它將隱藏。

p.s. $ state.is返回一個布爾值,這個方法也適用於ng-if。

+1

這不是目標,可以在狀態配置上實現,從我的角度來看這將是更清潔的方法。 – jribeiro

+0

我感興趣。你如何從狀態配置實現它? – LookForAngular

+0

你可以通過'nameOfView @ nameOfState'引用父視圖,然後將模板設置爲任何你想要的。但這與我的問題無關。我想以乾淨的角度動態移除視圖。 https://github.com/angular-ui/ui-router/wiki/Multiple-Named-Views#view-names---relative-vs-absolute-names您也可以使用onEnter,onExit回調。反正這不能回答我的問題。謝謝 – jribeiro