Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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模块路径范围问题_Javascript_Backbone.js_Module_Requirejs_Underscore.js - Fatal编程技术网

Javascript Require.js模块路径范围问题

Javascript Require.js模块路径范围问题,javascript,backbone.js,module,requirejs,underscore.js,Javascript,Backbone.js,Module,Requirejs,Underscore.js,我不明白为什么我的视图模块(overlay.screen.view.js)在发出警报时要求变量未定义(UncaughtTypeError:无法调用undefined的方法“template”)。路径看起来是正确的,但很明显有些地方出了问题。我做错了什么?提前谢谢 以下是我的目录结构: www |-js |-app consumer.activity.js |-views overlay.screen.view.js |-test |-vend

我不明白为什么我的视图模块(overlay.screen.view.js)在发出警报时要求变量未定义(UncaughtTypeError:无法调用undefined的方法“template”)。路径看起来是正确的,但很明显有些地方出了问题。我做错了什么?提前谢谢

以下是我的目录结构:

www
 |-js
   |-app
     consumer.activity.js
     |-views
       overlay.screen.view.js
   |-test
   |-vendor
     |-backbone
     |-fastclick
     |-jquery
     |-sinon
     |-superslides
     |-underscore
在我的consumer.activity.js文件(基本上是main.js)中:

以下是视图模块overlay.screen.view.js:

define( function( require ) {

    "use strict";

    var  $               = require('jquery'),
         _               = require('../../vendor/underscore/underscore-1.5.2-min'),
         Backbone        = require('../../vendor/backbone/backbone-1.1.0-min'),
         tmpl            = require('text!app/tmpl/overlayscreen.html'),
         template        = _.template(tmpl);  // // Uncaught TypeError: Cannot call method 'template' of undefined .

    alert($);
    alert(_);
    alert(Backbone);
    alert(template());

    return Backbone.View.extend({

        render: function() {

            this.$el.append(template());
            return this;

        },

        show: function( heightInPixels, widthInPixels ) {

            this.$('#overlayscreen').css('height', heightInPixels);
            this.$('#overlayscreen').css('width', widthInPixels);
            this.$('#overlayscreen').removeClass('hide');

        },

        hide: function() {

            this.$el.addClass('hide');

        }

    });

});
更新

Seddass在下面的帖子引导我找到以下解决方案。本质上,我需要更新require.config()路径,以便垫片按预期工作。代码如下:

require.config({
    baseUrl: '../../js',
    paths: {
        root: '..',
        jquery: 'vendor/jquery/jquery.2.0.3.min',
        underscore: 'vendor/underscore/underscore-1.5.2-min',
        backbone: 'vendor/backbone/backbone-1.1.0-min',
        test: 'test'
    },

    shim: {
        'jquery': {
            exports: '$'
        },
        'underscore': {
            exports: '_'
        },
        'backbone': {
            deps: [
                'underscore',
                'jquery'
            ],
            exports: 'Backbone'
        },
        'fastclick': {
            exports: 'FastClick'
        },
        'phonegap': {
            exports: 'phonegap'
        },
        'cordova': {
            exports: 'cordova'
        },
        'sinon': {
            exports: 'sinon'
        }
    }
});

require([
    'root/phonegap',
    'jquery',
    'underscore',
    'backbone',
    'vendor/fastclick/fastclick-0.6.11-min',
    'app/lib/xcelarys.app',

    // Views
    'app/views/overlay.screen.view',
    'app/views/global.header.1.view',

    // Models
    'app/models/global.header.1.models'
    ],
    function(
        phonegap,
        $,
        _,
        Backbone,
        FastClick,
        appConfig,
        ScreenOverlayView,
        GlobalHeader1,
        GlobalHeader1Model
    ) {
        "use strict";
        // code
    }
});
现在我可以访问模块中的libs了

define( function( require ) {
    "use strict";
    var  $               = require('jquery'),
         _               = require('underscore'),
         Backbone        = require('backbone'),
         tmpl            = require('text!app/tmpl/overlayscreen.html'),
         template        = _.template(tmpl);

    alert('overlay.screen#jquery = ' + $);
    alert('overlay.screen#underscore = ' + _);
    alert('overlay.screen#backbone = ' + Backbone);
    alert('overlay.screen#template' + template());

    // Code here!
});

问题是,到那时,它已经到达了exec

template        = _.template(tmpl);
下划线可能未完全加载。异步模块定义(AMD)中有“异步”的意思。您需要将代码重新构造为如下所示,以使其正常工作:

require(['underscore', 'text!app/tmpl/overlayscreen.html'], function (_, tmpl) {
    template        = _.template(tmpl);
    console.log (template);

});
您还可以查看中的示例

已更新

在中使用JSFIDLE模拟您的情况。 由于您已经在config对象中定义了所有模块,所以您可以在“sugar”版本中使用模块名称,如下所示,它应该可以工作

var  $               = require('jquery'),
     _               = require('underscore'),
    Backbone         = require('backbone');

我猜您的underline.js版本没有启用AMD,所以您在配置中使用了垫片。 但我相信在打电话的时候

require('../../vendor/underscore/underscore-1.5.2-min');
您的垫片无法识别您正在调用“下划线”以启用“\”的导出。 您是否尝试在路径、垫片设置和以后的设置中设置下划线,以要求其具有相同的路径

换言之:

require.config({
    ...
    paths: {
        'underscore' : '../../vendor/underscore/underscore-1.5.2-min',
        ....
    },
    shim: {
        'underscore' : {
             exports: '_'
        }
    }
});
在您的视图中(或在任何AMD js文件中):


应该有用

谢谢你,明。有几件事:1。我熟悉JS的异步特性。2.您提供的上述解决方案不起作用。3.我使用了一种称为语法糖()的方法,它消除了依赖项数组(在后台转换)的冗长性。4.overlay.screen.view.js文件中的路径或加载似乎仍然存在问题。提供了使用JSFIDLE的模拟解决方案。请让我知道,如果这有助于你的情况。
require.config({
    ...
    paths: {
        'underscore' : '../../vendor/underscore/underscore-1.5.2-min',
        ....
    },
    shim: {
        'underscore' : {
             exports: '_'
        }
    }
});
var _ = require('underscore');