javascript - 如何编写用于在 Ember.JS 中注册和注入(inject)的初始化程序?

标签 javascript ember.js

我第一次想到使用初始化器的想法是来自这个关于 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/

相关文章:

javascript - 告诉 Iron Router 不要拦截链接

ember.js - 如何从这个 promise 层蛋糕返回 bool 值?

ember.js - 将参数传递给 Ember triggerAction,后者调用带有参数的操作

ember.js - 路线上的 Emberjs 模态

javascript - 从 1.8.3 到 1.9.1 的 jQuery 迁移在一行中停止工作,我不知道为什么

javascript - 如何在 Meteor 中只允许插入和更新某些文档字段?

ember.js - 如何为所有 RESTAdapter ember 请求添加 header

php - Ember.js 与 mustache 库的兼容性

javascript - 当我想打印成绩时我的 java 脚本出错

javascript - 如何使用 JavaScript 从 html 登录表单重定向到欢迎页面?该网站处于离线状态并且位于开发服务器上