2016-05-17 51 views
0

我想爲wordpress網站編寫一個有角度的主題,並且我遵循使用functions.php定義一個指向views/partials文件夾的全局變量的常見wordpress/angular'模式' ,那麼它可以被路由引用。如何正確使用角度配置公司中的全局變量。測試

functions.php

wp_localize_script('appJs', 'localized', 
    array (
     'partials' => get_stylesheet_directory_uri() . '/views' 
    ) 
); 

我的角度配置類:

function AngularConfig($routeProvider, $locationProvider) { 
    $locationProvider.html5Mode(true); 

    $routeProvider 
     .when('/', { 
      templateUrl: localized.partials + '/home.html', 
      controller: 'HomeController' 
     }) 
     .when('/projects/', { 
      templateUrl: localized.partials + '/projects.html', 
      controller: 'ProjectsController' 
     }) 
     .when('/contact/', { 
      templateUrl: localized.partials + '/contact.html', 
      controller: 'ContactController' 
     }) 
     .otherwise({ 
      redirectTo: '/' 
     }); 
} 

export default AngularConfig; 

在運行這個工程,因爲localized是一個全球性的,具有partials的屬性。然而,我的測試(業力,茉莉花,phantomjs)失敗,因爲全球尚未在其環境中定義。 (另外,以這種方式直接引用全局變量是討厭的,並且違背整個DI運動等)

我想(我想)在配置類中注入`windowProvider',並從那裏獲取變量。事情是這樣的:

function AngularConfig($routeProvider, $locationProvider, $windowProvider) { 
    $locationProvider.html5Mode(true); 

    let partialsRoot = $windowProvider.$get().localized.partials; 

    $routeProvider 
     .when('/', { 
      templateUrl: partialsRoot + '/home.html', 
      controller: 'HomeController' 
     }) 
     .when('/projects/', { 
      templateUrl: partialsRoot + '/projects.html', 
      controller: 'ProjectsController' 
     }) 
     .when('/contact/', { 
      templateUrl: partialsRoot + '/contact.html', 
      controller: 'ContactController' 
     }) 
     .otherwise({ 
      redirectTo: '/' 
     }); 
} 

export default AngularConfig; 

但我不能工作,如何修改window/windowProvider測試啓動模塊之前。
我已經試過這樣:

beforeEach(module(MODULE_NAME, function ($windowProvider) { 
    let $window = $windowProvider.$get(); 
    $window.localized = { 
     partials: 'some-path/' 
    }; 
    console.log("WINDOW:", $window); 
})); 

然而,console.log沒有得到執行,除非我沒有在配置類引用.localized.partials - 這讓我想起了模塊(和配置)被實例化之前修改window

任何幫助或指針與此將非常感激。
感謝

回答

1

之所以$window服務是有它可以存根/嘲笑,所以沒有必要推倒真正的window如果服務污染它。

原始$window服務是指window任何方式,以及$windowProvider.$get(),使他們能夠互換window使用。

由於Angular服務是單身人士,因此注入$window服務的好處是它可以在整個應用程序中被模擬和使用,並引用相同的模擬對象。通常$window可以嘲笑這樣

// module order matters 
module(($provide) => { 
    $provide.factory('$window',() => {}); 
}, 'app'); 

當角DI與$windowProvider.$get()濫用,這是不正確的。當這樣調用時,它會引用不同的對象而不是嘲笑$window,這個對象不能從任何地方到達,而是調用它的函數範圍。

這種行爲可以通過嘲笑$window那樣被固定:

beforeEach(() => { 
    module({ $window: {} }, 'app'); 
    ... 

這樣

  • $windowProvider之前它嘲笑被注入到應用config
  • $windowProvider.$get$window指相同的{}對象,因爲該對象是在服務定義上創建的並且沒有包裝在工廠功能
  • 新鮮{}對於每個規格重新發布對象。

但要做到這一點,正確的方法是隻使用constant

app.constant('localized', window.localized); 

它的存在正是爲了這一點。通過DI擺脫全局常量並在配置和運行階段使用它們。它可以像任何其他服務一樣嘲笑

module(($provide) => { 
    $provide.constant('localized', {}); 
}, 'app');