【问题标题】:Ember js 1.12.0 - Failed to create instanceEmber js 1.12.0 - 无法创建实例
【发布时间】:2015-12-04 16:22:18
【问题描述】:

我正在尝试将我的配置文件注入到我的所有路由、控制器和组件中,而不是在每个文件中调用 import config from '../config/environment'。但是,我收到以下错误:

未捕获的错误:无法创建 'config:main' 的实例。很可能是定义不正确的类或无效的模块导出。

下面是我通过咖啡脚本渲染的代码。

// app/initializers/config.js

define('app/initializers/config', ['exports', 'app/config/environment'], function (exports, Config) {

'use strict';

var ConfigInitializer, initialize;

initialize = function (container, app) {
  var config;
  config = {
    config: Config['default']
  };
  app.register('config:main', config);
  app.inject('route', 'config', 'config:main');
  app.inject('controller', 'config', 'config:main');
  app.inject('component', 'config', 'config:main');
};

ConfigInitializer = {
  name: 'config',
  initialize: initialize
};

exports['default'] = ConfigInitializer;

exports.initialize = initialize;

我错过了什么?

我已经使用断点逐步完成了所有操作,并且我的 environment.js 文件的路径是正确的。所以我知道不是这样。我想我错过了一些关于依赖注入的基本知识。

【问题讨论】:

    标签: javascript ember.js ember-cli


    【解决方案1】:

    它抱怨初始化时无法实例化新的配置对象。尝试将您的配置对象更改为 Ember.Service

    import Ember from 'ember'
    
    initialize = function(container, app) { 
      var config = Ember.Service.extend({
        config: Config['default']
      }
      ...
    }
    

    【讨论】:

    • 我试过了,得到了以下错误: > 未捕获的类型错误:尝试注册一个未知的工厂:config:main 我确实修复了它,但只需在注册调用中添加{ instantiate: false }。我仍然不知道这一切背后的“原因”。
    【解决方案2】:

    您的代码中的一切看起来都很好,除了一件事。默认情况下,Ember 期望注册工厂而不是实例。因此,一旦属性被注入,它就会尝试从注册工厂获取实例。但是在您的情况下,它不是工厂,而是实例(对象)本身。所以你唯一需要做的就是让 Ember 按原样使用已注册的对象,而不是尝试获取实例。要实现这一点,只需将 instantiate: false 添加到 register 选项:

    app.register('config:main', config, {instantiate: false});
    

    【讨论】:

      猜你喜欢
      • 2015-07-26
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2020-01-16
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多