编辑4
在(来自Foundation 3包) app.js中定义了一个模块
(function($, window, undefined) {
'use strict';
var $doc = $(document), Modernizr = window.Modernizr;
$(document).ready(function() {
$.fn.foundationAlerts ? $doc.foundationAlerts() : null;
// ...
$.fn.foundationClearing ? $doc.foundationClearing() : null;
$('input, textarea').placeholder();
});
// touch support detction is omitted
})(jQuery, this);我试着把它解释成下一种形式:
BOOTSTRAP.JS
require.config({
paths: {
// other paths then..
'foundation': '../libs/zurb'
},
shim: {
'foundation/jquery.foundation.topbar': { deps: ['jquery'] },
'foundation/jquery.foundation.accordion': { deps: ['jquery'] },
// ..all that stuff..
'foundation/jquery.placeholder': { deps: ['jquery'] }
}
});
require(['domReady', 'app'], function(domReady, app) {
domReady(function() {
app.initialize();
});
});APP.JS
好吧..。我发现这不像预期的那样有效:
define(
[
'jquery',
'underscore',
'backbone',
'routing/AppRouter',
'foundation/modernizr.foundation',
'foundation/jquery.foundation.accordion',
// all that foundation scripts...
'foundation/jquery.placeholder'
],
function($, _, Backbone, AppRouter) {
return {
initialize: function() {
var $doc = $(document);
// these things fail
$.fn.foundationAccordion ? $doc.foundationAccordion() : null;
// ...
$.fn.placeholder ? $('input, textarea').placeholder() : null;
// this works great!
$('#slider').orbit();
// router/controller initialization
AppRouter.initialize();
}
};
}
);当页面加载时,可以看到foundation's ui元素根本无法工作(手风琴不会展开它的面板等等)。
当我在console中输入$(document).foundationAccordion() (页面在那时已经加载)时,它在页面上启用了UI elements。
救命!!
发布于 2012-12-17 13:57:17
在重读了汤姆的答案之后,我终于明白了!虽然这不是一个完整的图片,但我将分享我所拥有的)
我的bootstrap.js文件已经更改:
paths: {
// things like json2, underscore, jquery, backbone are ommited..
'fn': '../libs/zurb'
},
shim: {
'fn/jquery.foundation.accordion': {
deps: ['jquery'], exports: 'jQuery.fn.foundationAccordion'
},
// ...
'fn/jquery.foundation.orbit': {
deps: ['jquery'], exports: 'jQuery.fn.orbit'
}因此,看看每个基金会的脚本,看看它们得到了什么,这是非常有帮助的。
然后我写了以下几篇文章:
define(['jquery', 'underscore', 'backbone'], function($, _, Backbone) {
var AppRouter = Backbone.Router.extend({
routes: {
'': 'list',
'products/page/:page': 'list'
}
});
var renderSlider = function() {
// pay attention here
require(['views/SliderView', 'fn/jquery.foundation.orbit'], function(SliderView, orbit) {
$('#slider-wrapper .twelve.columns').prepend(new SliderView().el);
$('#slider').orbit();
});
};
var renderProductsList = function(page) {
require(['collections/ProductsList', 'views/ProductListView', 'fn/jquery.foundation.accordion'], function(ProductsList, ProductListView, foundationAccordion) {
var p = page ? parseInt(page, 10) : 1;
var productsList = new ProductsList();
productsList.fetch({
success: function() {
$("#content").html(new ProductListView({ model: productsList, page: p }).el);
// pay attention here
$(document).foundationAccordion();
},
error: function() {
console.log('error!');
}
});
});
}
var initialize = function() {
var appRouter = new AppRouter();
appRouter.on('route:list', function(page) {
renderSlider();
renderProductsList(page);
});
Backbone.history.start();
};
return {
initialize: initialize
};
});然后我把所有这些都包装在里面:
define(['jquery', 'underscore', 'backbone', 'routing/AppRouter'], function($, _, Backbone, AppRouter) {
return {
initialize: function() {
AppRouter.initialize();
}
};
});瞧!
发布于 2012-11-30 08:05:51
当您触发基础插件初始化器时,请确保您想要增加基础插件的所有DOM元素都在主DOM树中。在我看来,您正在动态地创建带有主干和模板的接口,但是Foundation似乎并没有考虑到这种方法。从代码上看,它似乎更多地针对静态页面,而不是高度动态的一页应用程序。
我不是使用基金会的专家,但我会尝试在路由器初始化之后移动基础脚本的初始化,在这里,我假设呈现第一个视图以确认我的假设。不过,我担心它不会自动地工作在整个应用程序中,而且每次您动态地重新绘制或创建使用基础组件的新视图时,您都必须至少将一些脚本重新应用到dom元素中,因为它们不会应用于应用程序生命周期后期动态创建的元素。
有些脚本使用文档中的委托,应该总是像工作一样的警报组件,但其他脚本(例如,手风琴)除非在将accordion元素(带有强制的类)插入DOM树之后调用,否则不会工作--因此,在将主干视图插入到主DOM树之前,作为独立节点的一部分不算,除非您修改基础插件,该插件不支持使用不同的选择器将手风琴行为附加到元素,或者添加到分离的DOM节点中的元素。
我建议您查看所有基础插件的源文件,看看它们是如何工作的,以及如何在一个页面应用程序的上下文中驯服它们,因为它们的实现质量与我在快速查看中看到的差异很大。看看他们的github。
发布于 2012-12-05 01:31:51
对于非AMD模块,需要在shim中显式指定exports。我不知道这些文件的当前内容,所以只看加载程序代码就有点难理解了。只要简单说明一下,您就会在定义中缺少.js扩展,除非它们已经被定义为AMD,否则您需要提供完整的路径,包括扩展。
如果请求是一个模块,那么它只会将一个参数传递给回调。如果不是,你将不得不在全球范围内访问它。如果必须对每个非模块执行define,则可以手工执行,但这违背了require的目的。
https://stackoverflow.com/questions/13564558
复制相似问题