gpt4 book ai didi

javascript - Require.js 模块路径范围问题

转载 作者:行者123 更新时间:2023-11-30 17:47:39 25 4
gpt4 key购买 nike

我不明白为什么我的 View 模块 (overlay.screen.view.js) 在发出警报时要求变量未定义(未捕获类型错误:无法调用未定义的方法"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):

require.config({

baseUrl: '../../js',
paths: {
root: '..',
jquery: 'vendor/jquery/jquery.2.0.3.min'
},
shim: {
'underscore': {
exports: '_'
},
'backbone': {
deps: [
'underscore',
'jquery'
],
exports: 'Backbone'
},
'fastclick': {
exports: 'FastClick'
},
'phonegap': {
exports: 'phonegap'
},
'cordova': {
exports: 'cordova'
},
'sinon': {
exports: 'sinon'
}
}

});

define(function(require) {

"use strict";

var // core libraries
phonegap = require('root/phonegap'),
$ = require('jquery'),
_ = require('vendor/underscore/underscore-1.5.2-min'),
Backbone = require('vendor/backbone/backbone-1.1.0-min'),
FastClick = require('vendor/fastclick/fastclick-0.6.11-min'),
appConfig = require('app/lib/xcelarys.app'),
ScreenOverlayView = require('app/views/overlay.screen.view'),
sinon,
test,

// $elements
$body;

try {
// Bootstrap test framework/server
if (xcelarys.app.environ() === 'DEV' && xcelarys.app.testMode() === 'ON') {
sinon = require('test/sinon');
test = require('test/xcelarys.test');
}

// Perform page config
FastClick.attach(document.body); // Make click events fast!

$body = $('body');

var screenOverlayView = new ScreenOverlayView( { el: $body } );
screenOverlayView.render();
screenOverlayView.show( window.outerHeight, window.outerWidth );
}
catch(e) {
console.log(e);
}

});

这里是 View 模块,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
}
});

现在我可以访问我模块中的库了。

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!
});

最佳答案

我猜你的 Underscore.js 版本没有启用 AMD,所以你在配置中使用了 shim。但是我相信在调用的时候

require('../../vendor/underscore/underscore-1.5.2-min');

您的 shim 无法识别您正在调用“下划线”来启用“_”的导出。您是否尝试过在路径、垫片设置中设置下划线,然后在同一路径中要求它?

换句话说:

require.config({
...
paths: {
'underscore' : '../../vendor/underscore/underscore-1.5.2-min',
....
},
shim: {
'underscore' : {
exports: '_'
}
}
});

在您的 View 中(或在任何 AMD js 文件中):

var _ = require('underscore'); 

应该可以。

关于javascript - Require.js 模块路径范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19793099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com