烬应用程序库初始化不工作
Ember app libraries initialization does not work
我们有一个Ember应用程序,需要在渲染一些模板时做一些库初始化。
-
Google+, Facebook和Twitter小部件的api。当用户直接登陆该页面时,我们在
application
路由中以及包含这些特定部件的每个模板中进行初始化。问题是Facebook和Twitter从另一条路由来的时候根本不初始化。然而,Google+做到了。此外,如果我们刷新所有3个小部件所在的页面,它们都会正确呈现。下面的例子是一个名为blog
的路由,它也从服务器API返回一个模型。renderTemplate: function () { this._super(); // initialize side nav drawer Ember.$(document).ready(function () { Ember.$('.button-collapse').sideNav(); Ember.$('select').material_select(); }); // load Google+ SDK Ember.$.getScript("https://apis.google.com/js/client:platform.js"); // initialize Facebook SDK var facebook_id = this.facebook_app_id; window.fbAsyncInit = function () { FB.init({ appId: facebook_id, xfbml: true, version: 'v2.1' }); }; (function (d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) { return; } js = d.createElement(s); js.id = id; js.src = "//connect.facebook.net/en_US/sdk.js"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); // load Twitter API window.twttr = (function (d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) { return t; } js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function (f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs")); }
-
Materialize侧抽屉(http://materializecss.com/)。我们需要全局初始化它,因为它将在用户从智能手机或平板电脑访问网站时使用。这里的问题是,在从我们的服务器API返回模型的路由上,侧抽屉不工作,即使我们在
application
路由内进行初始化,在模板渲染后。为什么它不能在有模型的路线上工作?renderTemplate: function () { this._super(); Ember.$(document).ready(function () { Ember.$('.button-collapse').sideNav(); Ember.$('select').material_select(); });}
所以显然没有办法在路由结束时使用回调,以便在那一刻初始化/解析UI元素。这有点糟糕。再说一遍,web和JS框架的很多工作方式都很糟糕。所以这里没有什么不寻常的。
无论如何,解决方案是使用Ember Components
,它建立在Web组件之上。只需将UI小部件的HTML代码封装在组件中;在我们的例子中,我们移动了Facebook分享按钮、Facebook Page Widget、Twitter分享按钮和Materialize侧导航按钮HTML到组件模板中(/templates/components/example-widget.hbs
)。然后在/components/example-widget.js
处创建相关组件。这也应该包含一个didInsertElement
回调。只要把你的代码放到回调里面就可以了
- 使用javascript函数在页面初始化后加载jquery
- 未捕获错误:无法在初始化之前调用方法;
- 如何在剑道网格初始化后设置pageSizes
- React redux初始化功能,无论状态变化如何
- 为什么可以't Protractor在自动初始化的Angular网站上查找Angular
- 尝试初始化()Spine's控制器和故障
- Angular.js延迟控制器初始化
- $(this.el).find()在事件处理程序中工作,而不是在初始化函数(主干.js)中工作
- 为什么这个对象初始化工作
- jQuery sortable 无法与水平列表正常工作,如果列表在初始化之前为空
- 在javascript中初始化对象;t在编译时工作
- 位置选择器无法在谷歌地图初始化中工作
- ngRoute工作,但我想切换到ui-router..现在我的应用程序似乎没有初始化
- Valums qq.当FileUploader在ajax加载按钮后初始化时,它不工作
- 初始化Cycle2插件在Windows和OSX上的工作方式不同
- 烬应用程序库初始化不工作
- 为什么剑道隐藏场的验证.UI javascript模板在模板上初始化时不工作
- 如何让这个AngularJS控制器工作($scope变量没有在控制器中初始化)
- 在事件回调函数中初始化时,jQuery插件不工作
- 初始化嵌套表单的对象不工作