2014-11-09 139 views
1

這裏是用例。給定一個stateConfig對象,我可以訪問state.url,但這隻返回該配置對象,不包括國家的父母的網址URL中指定的URL。我需要構建完整的URL以傳遞到$ urlMatcherFactory.compile,以測試匹配。

幸運的是,$state.$current提供了一個擴展狀態對象,這讓我反覆地穿越一個國家的父母和建立配套的完整URL。不幸的是,$state.$current顯然只包含當前狀態,但如果我可以用相同的方式包裝任意狀態,那將是非常好的。有任何想法嗎?

回答

2

您可以通過使用.decorator鉤上$stateProvider暴露內部狀態的實現。你可以裝飾國家建設者的任何財產;我任意選擇了「父母」。


app.config(function($stateProvider) { 
    $stateProvider.decorator('parent', function (internalStateObj, parentFn) { 
    // This fn is called by StateBuilder each time a state is registered 

    // The first arg is the internal state. Capture it and add an accessor to public state object. 
    internalStateObj.self.$$state = function() { return internalStateObj; }; 

    // pass through to default .parent() function 
    return parentFn(internalStateObj); 
    }); 
}); 

現在,您可以訪問使用.$$state()內部狀態的對象,e.gg

var publicState = $state.get("foo"); 
var privateInternalState = publicState.$$state(); 
+0

克里斯你是一個芭蕾舞者。非常感謝。 – Derek 2014-11-11 04:50:39

0

明白了。 有點測井後,我意識到,主叫state.$$state()將返回卷繞狀態配置對象。

+0

'狀態。$$狀態()'是一個'UI的路由器演員'功能。如果你想訪問沒有'ui-router-extras'的內部狀態,你可以使用'$ stateProvider.decorator()'函數註冊一個裝飾器,然後捕獲內部狀態。這就是ui-router-extras能夠暴露'state。$$ state()'能力的方式。 – 2014-11-09 21:31:59

+0

對不起,我以前的評論措辭不佳。我瞭解裝飾者如何在文檔中工作,但我不知道如何揭示它們。例如,對於父裝飾器,我怎樣才能將它暴露在狀態對象上? – Derek 2014-11-10 06:03:58

+0

發佈爲答案。 – 2014-11-10 16:38:09