【问题标题】:Iconic JS not rendering properly with Ember标志性 JS 无法使用 Ember 正确呈现
【发布时间】:2015-03-13 10:32:37
【问题描述】:

我正在开发一个 EmberJS 应用程序(我的第一个应用程序),但遇到了一些绊脚石。

我在大多数应用程序逻辑方面都取得了不错的进展,但是真正困扰我的一件事是 IconicJS 无法正常工作。本质上,IconicJS 将 SVG 数据“注入”到 <img> 元素中,因此每次出现具有适当类的新 <img> 元素时都需要运行。人们会这样做:

IconicJS().inject("img.iconic");

所以我试了一下,把它放在 app/views/application.js 和 Foundation 的初始化中:

import Ember from 'ember';

export default Ember.View.extend({
  didInsertElement: function() {
    this.$().foundation();
    IconicJS().inject('img.iconic');
  }
});

不过,这似乎只会在初始页面加载时触发。因此,初始页面加载后的任何导航都会导致 svg <img> 标签无法正确呈现。

我不确定这是否与我加载数据的方式有关,因为我对 Ember 还很陌生。

如果有人有任何想法,我真的很想听听他们的意见。如果我没有提供足够的信息,我会提前道歉。如果需要,我很乐意添加更多内容。

编辑

感谢 MrVinz,我能够完成这项工作。我需要的是一个初始化程序。因为我使用的是 Ember-CLI 应用程序,所以它位于app/initializers/initialize-assets.js。该文件的内容是(在我的情况下):

import Ember from 'ember';

export default {
  name: 'initialize-assets',
  initialize: function() {
    Ember.Route.reopen({
      renderTemplate: function() {
        this.render();
        var initResources = function() {
          Ember.$().foundation();
          IconicJS().inject('img.iconic');
        };
        Ember.run.scheduleOnce('afterRender', initResources);
      }
    });
  }
};

虽然我仍然不是 100% 从性能的角度来看这是解决此问题的最佳方法,但它现在似乎有效(所有适用的 <img> 标签都被注入,Foundation 仍然正常工作)所以我认为这暂时解决了它。

再次感谢!

【问题讨论】:

  • 只是一个关于初始化版本的小评论,我将用 'this._super()' 替换 'this.render()'

标签: ember.js iconic


【解决方案1】:

我知道这个问题已经得到解答,但我推荐的另一种方法是创建一个自定义图标组件,在组件呈现后调用 IconicJS().inject

export default Ember.Component.extend({
  didRender() {
    Ember.run.scheduleOnce(() => {
      IconisJS.inject('img.iconic');
    };
  }
});

我对 Iconic 不是很熟悉,所以不知道有没有更具体的方法,只将图标注入到当前组件中,但是如果它支持为 inject 方法指定任何选择器,你当然可以这样做。

【讨论】:

  • 嘿,抱歉,我刚刚看到您的评论...我喜欢这个想法,而且现在这可能是一种更符合意识形态的方式。当我问到它时,我想说回来,组件还没有被广泛使用。好电话!
【解决方案2】:

这仅适用于您的应用程序视图;)

对于适用于任何路线的更“通用”的东西,您可以尝试在这篇文章中执行类似的操作: Global hook in Ember when template is rendered

使用 cli,您可以在 app/routes/custom.js 中创建 CustomRoute

export default Ember.Route.Extend({
    renderTemplate : function(){
    this.render();var myfunction=function(){
      //do your jquerystuff here
       Ember.$().foundation();
       IconicJS().inject('img.iconic');
    }
    Ember.run.scheduleOnce('afterRender', myfunction);
  }
});

如果它用于所有路由,您可以在初始化程序中“重新打开”默认框架路由实现,如本文所述:Ember CLI: where to reopen framework classes

【讨论】:

  • 谢谢 MrVinz,我怀疑这与我对 Ember 的误解有关。我创建了您提到的app/routes/custom.js 文件,但我对重新打开有点不清楚。我必须在重新开放中加入逻辑吗?我会重新打开 CustomRoute 或 Ember.Route 吗?抱歉这些问题,我觉得这是我缺少的基本内容!谢谢!
  • 没关系,我明白了!用其他一些细节更新我的问题,以防其他人有类似的问题。再次感谢!
猜你喜欢
  • 2010-09-23
  • 2017-09-03
  • 2013-06-13
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 2015-03-18
  • 1970-01-01
相关资源
最近更新 更多