Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的require.js配置中没有调用垫片的'init'?_Javascript_Django_Backbone.js_Requirejs_Csrf - Fatal编程技术网

Javascript 为什么我的require.js配置中没有调用垫片的'init'?

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请求

更新

我正在写一个小模块来处理主干中的csrf令牌问题,直到我收到@Louis答案的推送通知

他的回答非常优雅,看起来很不错,但我将把它留给我的主干网。csrf模块github repo只为任何需要它的人提供

====================================================================

我正在使用主干作为前端框架以及Django后端

为了与Django的CSRF保护系统兼容,我必须配置我的
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'
     }
}
这样做的目的是,当需要模块
主干时,需要在任何地方(
*
)加载
主干胶水。但是,在
主干胶
中,当需要
主干胶
时,将加载
主干胶
。这允许
主干胶
加载原始主干