Angular 1.5 component dependency injection
Asked Answered
C

1

13

I've been trying to use the new Angular 1.5 component syntax in a project, but I can't figure out how to inject a dependency into the component definition.

Here's my attempt at refactoring an existing directive to a component:

angular
    .module('app.myModule')
    .component('row', {
      bindings: {
        details: '@',
        zip: '@'
      },
      controller: 'RowController',
      templateUrl: basePath + 'modules/row.html' // basePath needs to be injected
    })

For various reasons, we inject the constant basePath into all of our directives as part of the templateUrl.

How do I do this on a component, since the component definition is not a function?

Concubinage answered 14/5, 2016 at 18:36 Comment(0)
B
14

You can use a function for templateUrl to construct URL. However, unlike the one for directives, component templateUrl function is injectable (ref docs), which means that you can inject constant (or any other injectable service) into it. Exactly what you need:

.component('row', {
  bindings: {
    details: '@',
    zip: '@'
  },
  controller: 'RowController',
  templateUrl: function(basePath, $rootScope) { // $rootScope is an example here
    return basePath + 'modules/row.html'
  }
})

Minification-safe array notation is also supported:

templateUrl: ['basePath', '$rootScope', function(basePath, $rootScope) {
  return basePath + 'modules/row.html'
}]

Demo: http://plnkr.co/edit/jAIqkzZGnaEVPaUjyBrJ?p=preview

Burk answered 14/5, 2016 at 18:54 Comment(1)
Perfect! It didn't occur to me to make templateUrl into a function.Concubinage

© 2022 - 2024 — McMap. All rights reserved.