2015-03-13 34 views
0

我正在嘗試requireJS以改進使用Knockout在ASP.NET MVC應用程序上加載Javascript。加載帶有requireJS的標準JavaScript文件

我有一些文件定義這樣的定製KO綁定:

(function (ko, bindings) { 
    bindings.stopBinding = { 
     init: function() { 
      return { controlsDescendantBindings: false }; 
     } 
    }; 

    bindings.anotherBinding = { ... }; 
})(ko, ko.bindingHandlers); 

如果我嘗試這種方式加載的模塊requireJS:

define(['jquery', 'knockout', 'custom/knockout.bindings'], function ($, ko){ 
    ko.applyBindings(...); 
}); 

我得到一個ko is not defined錯誤。

我知道我可以附上在例如一個需要回調該文件以OT使其工作:

require(['knockout'], function (ko) { 
    (function (ko, bindings) { 
     bindings.stopBinding = { 
      init: function() { 
       return { controlsDescendantBindings: false }; 
      } 
     }; 

     bindings.anotherBinding = { ... }; 
    })(ko, ko.bindingHandlers); 
}); 

是否有另一種辦法可以讓這個文件,而不必更新每一個遺留工作應用程序中的JS文件?我想過使用墊片,但我沒有得到任何地方,但我是requireJS的小菜鳥,所以也許我錯過了一些明顯的東西。

+0

你會想'墊'他們。 – 2015-03-13 13:15:59

+0

@ DanielA.White我知道,但我對如何配置有問題的墊片有點無知。 – 2015-03-13 13:17:44

回答

0

感謝this answer,我設法將Knockout注入全局名稱空間,使其可用於需要它的舊版Javascript文件。

首先,創建注入KO在全局命名空間的模塊:

define('knockout.inject', ['knockout'], function (k) { 
    window.ko = k; 
    return k; 
}); 

然後,映射模塊淘汰賽執行它爲每一個淘汰賽的依賴。

var require = { 
    baseUrl: "/Scripts", 
    paths: { 
     //... 
     "knockout": "knockout-3.3.0.debug", 
     "knockoutbindings": "knockout.bindings", 
    }, 
    shim: { 
     "knockoutbindings": { 
      deps: ["knockout"] 
     } 
    }, 
    map: { 
     // inject ko back in the global namespace 
     '*': { 
      'knockout': 'knockout.inject' 
     }, 
     // prevent cycles 
     'knockout.inject': { 'knockout': 'knockout' } 
    } 
};