2013-07-10 25 views
1

我很努力與所有腳本#依賴加載。使用ScriptSharp與Knockout.Mapping通過RequireJS

我有一個腳本#項目引用淘汰賽庫。在與RequireJS一段時間之後,我開始工作了。現在

我想使用它符合喜歡的東西

var model = ko.mapping.fromJS(data, {}, new ViewModel()); 

然而ko.mapping是不確定的KnockoutJS映射。

如果我手動(用於測試只)改變編譯js文件以包括這樣的映射:

define('MyApp', 
    ['ss', 'jquery', 'knockout', knockout.mapping], 
    function (ss, $, ko, mapping) { /*...*/ } 
); 

「映射」被定義,但不爲「ko.mapping」,這是怎麼編譯器引用它。

任何想法?

這是我的配置:

requirejs.config({ 
    paths: { 
     'jquery': 'jquery-1.9.1', 
     'jqueryValidation': 'jquery.validate', 
     'knockout': 'knockout-2.2.0', 
     'knockout.mapping': 'knockout.mapping-latest.debug', 
     'modernizr': 'modernizr-2.6.2' 
    }, 
    shim: { 
     'jqueryValidation': ['jquery'], 
     'jquery.validate.unobtrusive': ['jquery', 'jqueryValidation'], 
     'jquery.unobtrusive-ajax': ['jquery'], 
     'knockout.mapping': ['knockout'] 
    } 
}); 
+0

請同時發佈您的require.config部分 – explunit

+0

^添加我的配置 – Sam7

回答

3

這聽起來像腳本#是假設koko.mapping是在全局命名空間,不加載AMD。但是,Knockout和Knockout.mapping是這樣編碼的,當它們檢測到AMD/RequireJS時,它們不使用全局名稱空間。

幾個選項來解決此問題:

1 - 它注入require.config被稱爲(基於下面的評論)之後,而不是在等待着什麼實際要求淘汰賽或knockout.mapping

requirejs.config({ 
    // same as original 
}); 

require(["knockout", "knockout.mapping"], function (ko, m) {  
    ko.mapping = m; 
}) 

2 - 創建您自己的包裝模塊將其注入全局。事情是這樣的:

define('knockout.inject', ['knockout'], function(k) 
{ 
    window.ko = k; // make a ko global 
    return k; // but also return what a normal AMD require expects 
}); 

define('knockout.mapping.inject', ['knockout.mapping'], function(m) 
{ 
    window.ko.mapping = m; // make a ko.mapping global 
    return m; // but also return what a normal AMD require expects 
}); 

然後,你可以做一個RequireJS地圖配置,這樣,只要你要求「淘汰賽」或「knockout.mapping」,他們得到透明地重新映射到你上面的包裝。

requirejs.config({ 
    paths: { // same as original }, 
    shim: { // same as original }, 
    map: { 
     '*': { 
     'knockout': 'knockout.inject', 
     'knockout.mapping': 'knockout.mapping.inject' 
     }, 
     // prevent cycles 
     'knockout.inject': {'knockout': 'knockout'}, 
     'knockout.mapping.inject': {'knockout.mapping': 'knockout.mapping'} 
    } 
}); 
+0

謝謝。看起來很有前途......但[window.ko.mapping = m;]永遠不會被調用。並且不會拋出異常。有任何想法嗎? – Sam7

+0

@ Sam7看起來像我的語法在'map'部分是錯誤的。請嘗試上面編輯的版本。 – explunit

+0

謝謝。我已經嘗試過,但事實並非如此。 我想通過添加這行代碼可以做到這一點 require([「knockout」,「knockout.mapping」],function(ko,m){ko.mapping = m;}); 所以如果你想調整你的答案,我很樂意讓它成爲解決方案。;) – Sam7

0

該樣品(https://github.com/nikhilk/scriptsharp/tree/cc/samples/KOWorld)示出了使用腳本#+敲除與requirejs作爲AMD裝載機一起。

一定要在AssemblyInfo.js中看到腳本模板來使所有這些工作成爲可能。

希望這會幫助和工作。

+0

請考慮在這裏發佈配置的關鍵部分,以防鏈接的示例演變爲其他內容。基本上你建議直接腳本標記引用Knockout而不是通過RequireJS加載它? – explunit

+0

謝謝尼克。我已經詳細研究了KOWorld示例,否則我將永遠無法獲得此處;) 但是在您的示例中沒有使用映射。 儘管.net包裝器顯示映射類/方法,但它不包含對knockout.mapping庫的'require'。 – Sam7