如何以AMD方式集成Foundation 3
编辑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);
我试着将它解释为下一个forms:
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元素根本不起作用(手风琴不扩展其面板等)。
当我在Chrome控制台中输入$(document).foundationAccordion()
(页面已被时间加载)时,它启用了页面上的UI elements
。
救命!!
当你触发它们的初始值设定项时,确保100%你想用基础插件调味的所有DOM元素已经在主DOM树中了。 在我看来,您正在动态创建与主干和模板的接口,但基金会似乎并没有准备好这种方法。 看一下代码,它看起来更像是静态页面,然后是高度动态的单页应用程序。
不是使用基础的专家,但我会尝试在路由器初始化之后移动基础脚本的初始化,我假设第一个视图被渲染以确认我的假设。 我担心它不会自动地为整个应用程序工作,每次你动态地重绘或创建使用基础组件的新视图时,你必须至少将一些脚本重新应用到dom元素,因为它们赢了不适用于稍后在应用程序生命周期中动态创建的元素。
有些脚本正在使用文档中的委托,并且应该始终工作 – 比如警报组件,但是除非在将手风琴元素(带有强制性accordion
类) 插入到DOM树中之后调用,否则其他像手风琴一样将无法工作 – 因此成为分离的一部分骨干视图插入主DOM树之前的节点不计算,除非您修改基础插件,该插件不支持将手风琴行为附加到具有不同选择器的元素或分离的DOM节点中的元素
我建议你查看所有基础插件的源文件,看看它们是如何工作的,以及如何在单页应用程序的环境中驯服它们,因为它们的实现质量与我在快速查看中看到的相差很多。 在他们的github上查看它 。
对于非AMD模块,您需要在填充程序中明确指定exports
。 我不知道这些文件的当前内容,因此仅通过查看加载器代码来进行计算有点困难。 只是一个简单的注释,你缺少,在define, .js
扩展名中,除非他们已经定义了AMD,否则你需要提供完整的路径,包括扩展名。
如果它是一个模块,requirejs只会将一个参数传递给回调。 如果不是,您将不得不全局访问它。 如果必须为每个非模块执行,那么您可以手动执行define
,但这会违反require
的目的
在重读汤姆的回答后,我终于明白了! 虽然这不是一个完整的图片我会分享我所拥有的)
我的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(); } }; });
瞧!