ビュー モジュール (overlay.screen.view.js) が警告時に変数が未定義 (Uncaught TypeError: Cannot call method 'template' of undefined) である必要がある理由がわかりません。パスは正しいように見えますが、明らかに何かがおかしくなっています。私は何を間違えましたか?前もって感謝します。
これが私のディレクトリ構造です:
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);
}
});
これがビュー モジュール、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!
});