Javascript 为什么我的require.js配置中没有调用垫片的'init'?
更新: 我正在写一个小模块来处理主干中的csrf令牌问题,直到我收到@Louis答案的推送通知 他的回答非常优雅,看起来很不错,但我将把它留给我的主干网。csrf模块github repo只为任何需要它的人提供 ==================================================================== 我正在使用主干作为前端框架以及Django后端 为了与Django的CSRF保护系统兼容,我必须配置我的Javascript 为什么我的require.js配置中没有调用垫片的'init'?,javascript,django,backbone.js,requirejs,csrf,Javascript,Django,Backbone.js,Requirejs,Csrf,更新: 我正在写一个小模块来处理主干中的csrf令牌问题,直到我收到@Louis答案的推送通知 他的回答非常优雅,看起来很不错,但我将把它留给我的主干网。csrf模块github repo只为任何需要它的人提供 ==================================================================== 我正在使用主干作为前端框架以及Django后端 为了与Django的CSRF保护系统兼容,我必须配置我的Backbone.sync,为每个AJAX请求
Backbone.sync
,为每个AJAX请求在发送之前设置CSRF请求头
由于我在模块化javascript开发中使用了require.js,因此我尝试在require.config
的shim.init
中对其进行配置,以便在主干加载到浏览器上时立即触发此重写:
<script>
var require = {
...
shim: {
'jquery': {'exports': 'jQuery'},
'backbone': {
'deps': ['underscore', 'jquery'],
'exports': 'Backbone',
'init': function(_, $) {
alert('NOT EVEN CALLED');
var originalSync = this.Backbone.sync;
this.Backbone.sync = function(method, model, options) {
options.beforeSend = function(xhr) {
xhr.setRequestHeader('X-CSRFToken', window.csrf_token);
}
return originalSync(method, model, options);
}
}
}
}
}
</script>
// Load require.js
<script src="require.js"></script>
var require={
...
垫片:{
'jquery':{'exports':'jquery'},
“主干”:{
“deps”:[“下划线”,“jquery'],
“出口”:“主干”,
'init':函数(389;,$){
警报(“甚至没有呼叫”);
var originalSync=this.Backbone.sync;
this.Backbone.sync=函数(方法、模型、选项){
options.beforeSend=函数(xhr){
xhr.setRequestHeader('X-CSRFToken',window.csrf_token);
}
返回原始同步(方法、模型、选项);
}
}
}
}
}
//加载require.js
尽管主干已成功加载,但不会调用require配置的“init”
问题是什么?查看,我看到主干在检测到它正在使用AMD加载程序运行时调用了define
。对调用define
的模块使用shim
会导致未定义的行为,因为shim
用于不调用define
的模块
您可以使用类似这样的伪主干模块实现您想要的功能,该模块将保存在名为backbone glue.js的文件中:
define(['backbone'], function (Backbone) {
var originalSync = Backbone.sync;
Backbone.sync = function(method, model, options) {
options.beforeSend = function(xhr) {
xhr.setRequestHeader('X-CSRFToken', window.csrf_token);
}
return originalSync(method, model, options);
};
return Backbone;
});
然后在RequireJS的配置中应该有这样一个映射:
map: {
'*': {
backbone: 'backbone-glue'
},
'backbone-glue': {
backbone: 'backbone'
}
}
这样做的目的是,当需要模块主干时,需要在任何地方(*
)加载主干胶水。但是,在主干胶
中,当需要主干胶
时,将加载主干胶
。这允许主干胶
加载原始主干