2015-12-22 20 views
0

比方說,我在本地運行我有一個MVC /的WebAPI/AngularJS網站,例如;從虛擬目錄或Web根以全局方式引用資源?

本地主機/測試/

然後我想要移動到

www.test.com

雖然地方,我有很多不同的目錄引用(jsfiles等)以下格式(任JS或HTML文件)

app.directive('rpdbSpinner', function() { 
    return { 
     restrict: 'E', 
     **templateUrl: '/Test/templates/directives/spinner.html',** 
     scope: { 
      isLoading:'=' 
     } 
    } 
}) 

更新/網絡出版的時候,我不得不一切更改爲:

app.directive('rpdbSpinner', function() { 
    return { 
     restrict: 'E', 
     **templateUrl: '/templates/directives/spinner.html',** 
     scope: { 
      isLoading:'=' 
     } 
    } 
}) 

我可以手動執行此操作(這是我一直在做的),但是項目越大,它變得越難。我當然可以,只改變一次,然後在發佈階段(web.config中/其他)排除的文件,但它仍然感覺我會約了錯誤的方式。使用「〜/」不會在普通的HTML工作/ JS文件,據我所知,這個我真的不能使用它...

任何建議,以映射到路徑全球無論在虛擬目錄還是項目的根?

謝謝:)

+0

在根html/.Net頁面上設置baseUrl。爲服務器環境創建具有正確baseUrl的發佈分支。 –

回答

1

如果你只是關心獲得站點的根目錄/基網址,以便您可以追加,要得到其他網址你之後,你可以簡單地使用/爲您的網址的第一個字符。

var getUsersUrl = "/api/users"; 

這是一種替代方法,如果你需要的不僅僅是應用程序根以上(例如:特定的URL(使用MVC輔助方法如Url.RouteUrl等)

內置

你不應該硬編寫你的應用程序的基本路徑這樣的。你可以使用你的剃鬚刀鑑於Url.ContentUrl.RouteUrl輔助方法生成的URL應用用戶羣,它會採取正確建立網址護理不管你當前頁/ path.Once的你這個值,將其分配給一個JavaScript VAR並在你的其他js代碼中使用它來構建你的其他url。 始終確保這樣做時使用的JavaScript命名空間,以避免與全局JavaScript變量可能存在的問題。

因此,在您的Razor視圖(版式文件或特定視圖),可以做到這一點。

<script> 
    var myApp = myApp || {}; 
    myApp.Urls = myApp.Urls || {}; 
    myApp.Urls.baseUrl = '@Url.Content("~")';  
    myApp.Urls.userListUrl = '@Url.Action("Index","User")';  
</script> 
<script src="~/Scripts/NonAngularJavaScript.js"></script> 
<script src="~/Scripts/AngularControllerForPage.js"></script> 
<script> 
    var a = angular.module("app").value("appSettings", myApp); 
</script> 

在你的角度控制器,你可以訪問它喜歡,

var app = angular.module("app", []); 
var ctrl = function (appSettings) { 

    var vm = this; 
    console.log(appSettings.Urls.userListUrl); 

    vm.baseUrl = appSettings.Urls.baseUrl; 
    //build other urls using the base url now 
    var getUsersUrl = vm.baseUrl + "api/users"; 
    console.log(getUsersUrl); 

}; 
app.controller("ctrl", ctrl) 

您也可以訪問此數據中的服務,指令等

在您的非角Java腳本文件。

// With the base url, you may safely add the remaining url route. 
var urlToJobIndex2= myApp.Urls.baseUrl+"jobs/GetIndex"; 
+0

這聽起來像是一個非常好的方法。我只是被這個混淆了:var app = angular.module(「app」,[]);和var a = angular.module(「app」)。value(「appSettings」,myApp); 。爲什麼要聲明'應用程序'兩次? (對角度也是新的) –

+0

第一個是創建角度模塊,第二個(沒有空數組作爲第二個參數)正在讀回它。 – Shyju

+0

這看起來像一個非常好的解決方案 - 謝謝。我會繼續帶着疑問纏着你,當他們一起去:) –

0

使用「〜/」不會在普通HTML/JS文件,據我所知, 工作,這個我真的不能使用它...

是的,但你可以在你的主服務器端把它注射擔任網頁作爲一個變量:

<script> 
    var baseUrl = ... get the base url from the server using ~/ 
</script> 

,然後在外部腳本只是在連接相對URL與它一起。就靜態HTML文件而言,它可能會有點問題。您可以通過一些特殊的服務器端處理程序來處理它們,這些處理程序將負責注入此邏輯。

0

您可以使用module.constant創建注射,您可以使用。

app.constant("URL_BASE", "/Test"); 

app.directive('rpdbSpinner', function(URL_BASE) { 
    return { 
     restrict: 'E', 
     **templateUrl: URL_BASE + '/templates/directives/spinner.html',** 
     scope: { 
      isLoading:'=' 
     } 
    } 
}) 

如果您在註冊您的指令之前註冊它,也可以使用module.value

欲瞭解更多信息,請參閱AngularJS Module Guide -- configuration