2015-12-06 2 views
3

Я пытаюсь подключить две директивы, используя require и разделяя родительский контроллер.угловой директивный контроллер «this» return undefined

Я делал это Gazillion раз в других проектах, но для жизни меня я не могу получить эту работу ...

Контроллер директива this возвращается неопределенным, что в свою очередь делает его трудно передать методы в директиве ребенка ...

вот мой код для родительской директивы:

app.directive('defaultHeader',() => { 

    let defaultHeaderCtrl = ($scope, $element) => { 

     let containEl, 
      elHeight = 500; 

     console.log(this) // returns 'undefined' 

     function resizeElement(el, height) { 
      el[0].style.height = `${height}px` 
     } 

     if (_.isUndefined($scope.coverImgUrl)) { 
      resizeElement($element, elHeight); 
     } else { 

     } 
    }; 

    return { 
     restrict: 'A', 
     scope: { 
      coverImgUrl: '=' 
     }, 
     controller: defaultHeaderCtrl 
    }; 
}); 

This fiddle показывает, что контроллер директивы this должен возвращаться конструктор.

Вот некоторые контексты, если кто-нибудь интересуются:

  • пользовательского интерфейс шаблон маршрутизатора является директивой элементом <div default-header data="data"></div>
  • щий маршрутизатор решает данные, а затем передает его через контроллер с директивой

спасибо помощь

+0

ограничивать 'A' в директивном коде, но в вашем шаблоне вы используете директиву как элемент. –

+1

спасибо @FidanHakaj - это был всего лишь пример кода, но я исправил его, чтобы лучше представить фактическую директиву. – geoctrl

+0

Я открыл вашу скрипку и записывал 'Constructor {}', а не undefined –

ответ

6

Arrow (помимо того, что они выглядят опрятно) служит для замены lexical this с контекстным. Поскольку контроллер также определен в функции стрелок, он получит свой родительский контекст как this. Который undefined в строгом режиме.

Использование

function defaultHeaderCtrl ($scope, $element) { ... } 

и не заменяют все function со стрелками только потому, что ES6 это позволяет.

+0

Абсолютно верно: «не заменяйте все« функции »стрелками только потому, что ES6 позволяет это« – Robusto

+0

совершенный ответ - изменил мой ответ, чтобы указать на ваш - я смутно помните, что читали о лексическом «этом» при погружении в компилятор Babel. Думаю, мне нужно вернуться к этому: – geoctrl

+0

Да, это довольно элегантная замена старого шаблона 'var self = this'. – estus

0

Это оказалось довольно легко решить после того, как я начал изучать различия между моими код и отправленный jsFiddle.

Я использую babeljs, и, очевидно, что-то происходит с областью, когда я использую синтаксис функции стрелки для контроллера () => {}.

После переключения на function() {}, this теперь возвращает конструктор, и директивы работают должным образом.

См отмечен ответ выше для контекста функция^

Смежные вопросы