buildRegistry: function(namespace) { var registry = new Registry(); registry.set = set; registry.resolver = resolverFor(namespace); registry.normalizeFullName = registry.resolver.normalize; registry.describe = registry.resolver.describe; registry.makeToString = registry.resolver.makeToString; registry.optionsForType('component', { singleton: false }); registry.optionsForType('view', { singleton: false }); registry.optionsForType('template', { instantiate: false }); registry.optionsForType('helper', { instantiate: false }); registry.register('application:main', namespace, { instantiate: false }); registry.register('controller:basic', Controller, { instantiate: false }); registry.register('controller:object', ObjectController, { instantiate: false }); registry.register('controller:array', ArrayController, { instantiate: false }); registry.register('view:select', SelectView); registry.register('route:basic', Route, { instantiate: false }); registry.register('event_dispatcher:main', EventDispatcher); registry.register('router:main', Router); registry.injection('router:main', 'namespace', 'application:main'); registry.register('location:auto', AutoLocation); registry.register('location:hash', HashLocation); registry.register('location:history', HistoryLocation); registry.register('location:none', NoneLocation); registry.injection('controller', 'target', 'router:main'); registry.injection('controller', 'namespace', 'application:main'); registry.register('-bucket-cache:main', BucketCache); registry.injection('router', '_bucketCache', '-bucket-cache:main'); registry.injection('route', '_bucketCache', '-bucket-cache:main'); registry.injection('controller', '_bucketCache', '-bucket-cache:main'); registry.injection('route', 'router', 'router:main'); registry.injection('location', 'rootURL', '-location-setting:root-url'); // DEBUGGING registry.register('resolver-for-debugging:main', registry.resolver.__resolver__, { instantiate: false }); registry.injection('container-debug-adapter:main', 'resolver', 'resolver-for-debugging:main'); registry.injection('data-adapter:main', 'containerDebugAdapter', 'container-debug-adapter:main'); // Custom resolver authors may want to register their own ContainerDebugAdapter with this key registry.register('container-debug-adapter:main', ContainerDebugAdapter); return registry; }
function buildRegistry(namespace) { var registry = new Registry(); registry.set = set; registry.resolver = resolverFor(namespace); registry.optionsForType("view", { singleton: false }); registry.optionsForType("template", { instantiate: false }); registry.register("application:main", namespace, { instantiate: false }); registry.injection("router:main", "namespace", "application:main"); registry.register("location:hash", HashLocation); registry.register("controller:basic", Controller, { instantiate: false }); registry.register("controller:object", ObjectController, { instantiate: false }); registry.register("controller:array", ArrayController, { instantiate: false }); registry.register("view:default", _MetamorphView); registry.register("view:toplevel", EmberView.extend()); registry.register("view:-outlet", OutletView); registry.register("view:core-outlet", CoreOutletView); registry.register("router:main", EmberRouter.extend()); registry.typeInjection("route", "router", "router:main"); return registry; }
function buildRegistry(namespace) { var registry = new Registry(); registry.set = set; registry.resolver = resolverFor(namespace); registry.optionsForType('view', { singleton: false }); registry.optionsForType('template', { instantiate: false }); registry.register('application:main', namespace, { instantiate: false }); registry.injection('router:main', 'namespace', 'application:main'); registry.register('location:hash', HashLocation); registry.register('controller:basic', Controller, { instantiate: false }); registry.register('controller:object', ObjectController, { instantiate: false }); registry.register('controller:array', ArrayController, { instantiate: false }); registry.register('view:toplevel', EmberView.extend()); registry.register('view:-outlet', OutletView); registry.register('view:core-outlet', CoreOutletView); registry.register('router:main', EmberRouter.extend()); registry.typeInjection('route', 'router', 'router:main'); return registry; }
test("'store' can be injected by data persistence frameworks", function() { expect(8); run(route, 'destroy'); var registry = new Registry(); var container = registry.container(); var post = { id: 1 }; var Store = EmberObject.extend({ find: function(type, value){ ok(true, 'injected model was called'); equal(type, 'post', 'correct type was called'); equal(value, 1, 'correct value was called'); return post; } }); registry.register('route:index', EmberRoute); registry.register('store:main', Store); registry.injection('route', 'store', 'store:main'); route = container.lookup('route:index'); equal(route.model({ post_id: 1}), post, '#model returns the correct post'); equal(route.findModel('post', 1), post, '#findModel returns the correct post'); });
QUnit.test('Injecting a falsy value does not raise an error', function() { var registry = new Registry(); var container = registry.container(); var ApplicationController = factory(); registry.register('controller:application', ApplicationController); registry.register('user:current', null, { instantiate: false }); registry.injection('controller:application', 'currentUser', 'user:current'); strictEqual(container.lookup('controller:application').currentUser, null); });
setup: function() { registry = new Registry(); container = registry.container(); //register the HashLocation (the default) registry.register('location:hash', HashLocation); // ensure rootURL is injected into any locations registry.injection('location', 'rootURL', '-location-setting:root-url'); Router = EmberRouter.extend(); },
QUnit.test('An injected non-singleton instance is never cached', function() { var registry = new Registry(); var container = registry.container(); var PostView = factory(); var PostViewHelper = factory(); registry.register('view:post', PostView, { singleton: false }); registry.register('view_helper:post', PostViewHelper, { singleton: false }); registry.injection('view:post', 'viewHelper', 'view_helper:post'); var postView1 = container.lookup('view:post'); var postView2 = container.lookup('view:post'); ok(postView1.viewHelper !== postView2.viewHelper, 'Injected non-singletons are not cached'); });
QUnit.test('fallback for to create time injections if factory has no extend', function() { var registry = new Registry(); var container = registry.container(); var AppleController = factory(); var PostController = factory(); PostController.extend = undefined; // remove extend registry.register('controller:apple', AppleController); registry.register('controller:post', PostController); registry.injection('controller:post', 'apple', 'controller:apple'); var postController = container.lookup('controller:post'); equal(postController._debugContainerKey, 'controller:post', 'instance receives _debugContainerKey'); ok(postController.apple instanceof AppleController, 'instance receives an apple of instance AppleController'); });
QUnit.test('An individual factory with a registered injection receives the injection', function() { var registry = new Registry(); var container = registry.container(); var PostController = factory(); var Store = factory(); registry.register('controller:post', PostController); registry.register('store:main', Store); registry.injection('controller:post', 'store', 'store:main'); var postController = container.lookup('controller:post'); var store = container.lookup('store:main'); equal(store._debugContainerKey, 'store:main'); equal(postController._debugContainerKey, 'controller:post'); equal(postController.store, store, 'has the correct store injected'); });
var buildRegistry = function(namespace) { var registry = new Registry(); registry.set = set; registry.resolver = resolverFor(namespace); registry.optionsForType('view', { singleton: false }); registry.optionsForType('template', { instantiate: false }); registry.register('application:main', namespace, { instantiate: false }); registry.injection('router:main', 'namespace', 'application:main'); registry.register('location:hash', HashLocation); registry.register('controller:basic', Controller, { instantiate: false }); registry.register('controller:object', ObjectController, { instantiate: false }); registry.register('controller:array', ArrayController, { instantiate: false }); registry.typeInjection('route', 'router', 'router:main'); return registry; };
QUnit.test('Injecting a failed lookup raises an error', function() { ENV.MODEL_FACTORY_INJECTIONS = true; var registry = new Registry(); var container = registry.container(); var fooInstance = {}; var fooFactory = {}; var Foo = { create(args) { return fooInstance; }, extend(args) { return fooFactory; } }; registry.register('model:foo', Foo); registry.injection('model:foo', 'store', 'store:main'); throws(function() { container.lookup('model:foo'); }); });
QUnit.test('A factory with both type and individual injections', function() { var registry = new Registry(); var container = registry.container(); var PostController = factory(); var Store = factory(); var Router = factory(); registry.register('controller:post', PostController); registry.register('store:main', Store); registry.register('router:main', Router); registry.injection('controller:post', 'store', 'store:main'); registry.typeInjection('controller', 'router', 'router:main'); var postController = container.lookup('controller:post'); var store = container.lookup('store:main'); var router = container.lookup('router:main'); equal(postController.store, store); equal(postController.router, router); });
QUnit.test('Destroying the container destroys any cached singletons', function() { var registry = new Registry(); var container = registry.container(); var PostController = factory(); var PostView = factory(); var template = function() {}; registry.register('controller:post', PostController); registry.register('view:post', PostView, { singleton: false }); registry.register('template:post', template, { instantiate: false }); registry.injection('controller:post', 'postView', 'view:post'); var postController = container.lookup('controller:post'); var postView = postController.postView; ok(postView instanceof PostView, 'The non-singleton was injected'); container.destroy(); ok(postController.isDestroyed, 'Singletons are destroyed'); ok(!postView.isDestroyed, 'Non-singletons are not destroyed'); });
registry.makeToString = registry.resolver.makeToString; registry.optionsForType('component', { singleton: false }); registry.optionsForType('view', { singleton: false }); registry.optionsForType('template', { instantiate: false }); registry.optionsForType('helper', { instantiate: false }); registry.register('application:main', namespace, { instantiate: false }); registry.register('controller:basic', Controller, { instantiate: false }); registry.register('controller:object', ObjectController, { instantiate: false }); registry.register('controller:array', ArrayController, { instantiate: false }); registry.register('renderer:-dom', { create() { return new Renderer(new DOMHelper()); } }); registry.injection('view', 'renderer', 'renderer:-dom'); registry.register('view:select', SelectView); registry.register('view:-outlet', OutletView); registry.register('-view-registry:main', { create() { return {}; } }); registry.injection('view', '_viewRegistry', '-view-registry:main'); registry.register('view:default', _MetamorphView); registry.register('view:toplevel', NgularView.extend()); registry.register('route:basic', Route, { instantiate: false }); registry.register('event_dispatcher:main', EventDispatcher); registry.injection('router:main', 'namespace', 'application:main'); registry.injection('view:-outlet', 'namespace', 'application:main');