我第一次想到使用初始化器的想法是来自这个关于 ember 中本地存储的使用的问题:
How to use HTML5 Local Storage with Ember.js?
后续研究表明,目前初始化程序的记录很少,因此有一些事情并不完全清楚。
在上面列出的问题中,接受的答案建议创建两个初始化程序,一个用于注册,一个用于注入(inject)。在其他示例中,我看到寄存器和注入(inject)都是在同一个初始化程序中完成的。我正在使用 Ember 应用程序套件进行开发,该套件使用 ES6 模块并有两个单独的文件,一个用于注入(inject)初始化程序,一个用于寄存器初始化程序,这似乎有点麻烦。以下似乎工作正常,但问题是,我是否应该出于某种原因使用两个初始化程序?
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');
}
};
app/app.js
//Use an initializer to inject local session storage
//to all routes & controllers
import SessionInitializer from 'appkit/initializers/local_session';
Ember.Application.initializer(SessionInitializer);
此外,这些示例使用特定格式来注册和注入(inject)类的名称,例如 storage:main
。 API 将变量引用为 fullName,但并没有真正说明有效名称应该是什么。以下是 API 文档中注册函数的示例:
http://emberjs.com/api/classes/Ember.Application.html#method_register
App = Ember.Application.create();
App.Person = Ember.Object.extend({});
App.Orange = Ember.Object.extend({});
App.Email = Ember.Object.extend({});
App.session = Ember.Object.create({});
App.register('model:user', App.Person, {singleton: false });
App.register('fruit:favorite', App.Orange);
App.register('communication:main', App.Email, {singleton: false});
App.register('session', App.session, {instantiate: false});
但是,当我尝试将初始化程序命名为 session
(如上一个示例所示)时,我从 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});
关于javascript - 如何编写用于在 Ember.JS 中注册和注入(inject)的初始化程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21542068/