烬应用程序库初始化不工作

Ember app libraries initialization does not work

本文关键字:工作 初始化 程序库 应用 应用程序      更新时间:2023-09-26

我们有一个Ember应用程序,需要在渲染一些模板时做一些库初始化。

  1. Google+FacebookTwitter小部件的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"));
              }
    
  2. 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回调。只要把你的代码放到回调里面就可以了