當使用requirejs加載handlebarjs時,我得到一條ReferenceError: Handlebars is not defined
消息。與RequireJS一起使用手柄,ReferenceError:手柄未定義
這是我在app.js配置文件
requirejs.config({
'baseUrl': 'assets/js',
'paths': {
'handlebars' : 'plugins/handlebars',
'controller' : 'controller',
'initialize' : 'initialize'
},
'shim' : {
'handlebars': {
exports: 'handlebars'
},
'controller' : {
deps: [
'handlebars'
]
}
}
});
requirejs([
'handlebars',
'initialize',
'controller'
]);
在controller.js文件我有這樣的:
var source = $("#entry-template").html();
var template = Handlebars.compile(source);
var context = {title: "My New Post", body: "This is my first post!"};
var ihtml = template(context);
$('.testad').html(ihtml);
但是,當我裹着這上面的代碼,它似乎工作:
define(['handlebars'], function(Handlebars) {
// place above code here
});
但問題是,我有define()
之外的方法,它可以在其中不叫。
define(['handlebars'], function(Handlebars) {
// place above code here
function handleMe() {
// some codes here
}
});
function callMe() {
handleMe();
}
的另一個問題是,我有一個initialize.js,以查找屬性my-controller
並調用分配給它的功能。有點「模塊化」。
define(['jquery'], function($) {
$(function() {
$('[my-controller]').each(function(e, t) {
var a = $(t).attr('my-controller');
'undefined' != typeof window[a] && $.isFunction(window[a]) ? window[a]($) : '';
});
});
所以在我的HTML,如果我有<div my-controller="callMe"></div>
,它會自動調用callMe()
方法,其中,它是我的controller.js文件。但是將callMe()
定義在裏面,因爲它不再是全局的,所以不能調用它。
謝謝安德魯。我必須爲每個define()創建一個新文件嗎?就像上面給出的帶有句柄的示例一樣,我應該爲handlebar邏輯創建controller-handlebar.js文件嗎?並創建另一個文件,如say,controller-whateverplugin.js?我知道你可以做'define(['handlebars','whateverplugin'],函數(handlebars,whateverplugin){})',但是如果依賴太多,就很難閱讀。有什麼建議麼? – basagabi
這是使用require的最大優點之一,實際上它的主要目的(如CommonJS,它是一個模塊/加載器/)。每個'define()'都有它自己的文件。你也不需要在'require.config()'的'paths:[]'部分放置'controller.js'。只要名稱匹配('Controller' ==='assets/js/Controller.js'),Require就會知道在何處使用它並加載它。只要讓它爲你做的工作。聲明可以變得很長,是的,但它隻影響'define()'的第一行,並且作爲回報,你可以擁有一個龐大的代碼庫,不存在依賴性頭痛問題。 – Andrew