Javascript 如何编写在Ember.JS中注册和注入的初始值设定项?

Javascript 如何编写在Ember.JS中注册和注入的初始值设定项?,javascript,ember.js,Javascript,Ember.js,我首先从这个关于在ember中使用本地存储的问题中发现了使用初始值设定项的想法: 随后的研究表明,目前对初始值设定者的记录很差,因此有一些事情并不十分清楚 在上面列出的问题中,公认的答案建议创建两个初始值设定项,一个用于注册,一个用于注入。在其他例子中,我看到寄存器和注入都是在同一个初始值设定项中完成的。我正在使用Ember应用程序工具包进行开发,它使用ES6模块,有两个单独的文件,一个用于注入初始值设定项,另一个用于寄存器初始值设定项,这似乎有点麻烦。下面的方法似乎很好,但问题是,出于某种原

我首先从这个关于在ember中使用本地存储的问题中发现了使用初始值设定项的想法:

随后的研究表明,目前对初始值设定者的记录很差,因此有一些事情并不十分清楚

在上面列出的问题中,公认的答案建议创建两个初始值设定项,一个用于注册,一个用于注入。在其他例子中,我看到寄存器和注入都是在同一个初始值设定项中完成的。我正在使用Ember应用程序工具包进行开发,它使用ES6模块,有两个单独的文件,一个用于注入初始值设定项,另一个用于寄存器初始值设定项,这似乎有点麻烦。下面的方法似乎很好,但问题是,出于某种原因,我应该使用两个初始值设定项吗

app/initializers/local_sesseion.js

/*
Register and Inject LocalSessionStorage
*/

//import local session storage model
import LocalSessionStorage from 'appkit/models/local_session_storage';

//use local session storage to act as a session manager
export default {
  name: "registerStorage",
  initialize: function(container, application) {
    application.register('storage:session', LocalSessionStorage, {singleton: true});
    application.inject('controller', 'session', 'storage:session');
    application.inject('route', 'session', 'storage:session');
  }
};
//Use an initializer to inject local session storage
//to all routes & controllers
import SessionInitializer from 'appkit/initializers/local_session';
Ember.Application.initializer(SessionInitializer);
app/app.js

/*
Register and Inject LocalSessionStorage
*/

//import local session storage model
import LocalSessionStorage from 'appkit/models/local_session_storage';

//use local session storage to act as a session manager
export default {
  name: "registerStorage",
  initialize: function(container, application) {
    application.register('storage:session', LocalSessionStorage, {singleton: true});
    application.inject('controller', 'session', 'storage:session');
    application.inject('route', 'session', 'storage:session');
  }
};
//Use an initializer to inject local session storage
//to all routes & controllers
import SessionInitializer from 'appkit/initializers/local_session';
Ember.Application.initializer(SessionInitializer);
此外,示例使用特定格式作为注册和注入的类的名称,例如
storage:main
。API将变量引用为全名,但实际上没有说明有效名称应该是什么。以下是API文档中寄存器函数的示例:

然而,当我试图命名我的初始值设定项时,正如上一个示例所示,我从Ember得到了这个错误:

Uncaught TypeError: Invalid Fullname, expected: `type:name` got: session 
错误源于ember.js中的此函数:

var VALID_FULL_NAME_REGEXP = /^[^:]+.+:[^:]+$/;
function validateFullName(fullName) {
  if (!VALID_FULL_NAME_REGEXP.test(fullName)) {
    throw new TypeError('Invalid Fullname, expected: `type:name` got: ' + fullName);
  }
}

这个错误仅仅意味着,Ember希望您为新类型指定一个名称。例如“session:main”而不仅仅是“session”

App.register('session:main',App.session,{instantiate:false});

是的,除了他们自己的文档建议单独使用“会话”是可能的()之外,这仍然留下了名称类型部分重要性的问题。我一直在使用我的register/inject和storage:session,这很有意义,而且似乎工作得很好,从我对代码的阅读来看,使用的类型似乎只是为了名称空间,没有功能性应用程序。除此之外,我的register和inject仍然使用相同的初始值设定项(工作得很好),但不确定为什么大多数示例都将它们分隔为单独的连续初始值设定项。我想这可能是为了保证类对象在被注入之前被注册,但它确实按照我的方式工作。所以