1

Я искал все, и единственное, что я могу придумать, это то, что я не понимаю ничего принципиального в том, как работает функция компиляции.Доступ к контроллеру из функции компиляции в директивах

Вот что у меня есть

angular.module("app", []) 
.directive("foo", function(){ 
    return { 
    scope: {}, 
    controller: function() { 
     this.someValue = 23; 
    }, 
    contollerAs: "ctrl", 
    compile: function(tElem, tAttrs) { 
     tElem.html("<h1>Data: {{ctrl.someValue}}</h1>"); 
    }, 
    template: '<h1>test</h1>' 
    } 
}); 

Здесь отображается: данные: и не похоже, чтобы увидеть "SomeValue" переменной. Однако, когда я использую scope вместо синтаксиса controllerAs, он работает.

//this works fine 
angular.module("app", []) 
.directive("foo", function(){ 
    return { 
    scope: {}, 
    controller: function($scope) { 
     $scope.someValue = 23; 
    }, 
    contollerAs: "ctrl", 
    compile: function(tElem, tAttrs) { 
     tElem.html("<h1>Data: {{someValue}}</h1>"); 
    }, 
    template: '<h1>test</h1>' 
    } 
}); 

Это показывает: данные: 23

Есть ли что-то я здесь отсутствует? Я даже правильно использую компиляцию? Руководство кажется менее полезным.

ответ

2

Потому что есть опечатка. Это controllerAs, а не contollerAs.

Рекомендуется использовать template function вместо compile. Это упростит модернизацию компонентов в будущем, а также избавит от проблем - compile в приведенной выше директиве не будет работать правильно, если нет шаблона <h1>test</h1>.

+0

Ничего себе, полностью смущен. Я не могу поверить, что не видел, что через 2 часа смотрел на этот кусок кода! Не могли бы вы также объяснить, по возможности, для чего предназначена функция компиляции. Что бы он никогда не использовал, если связь, контроллер и шаблон позаботятся обо всем. Есть ли в этом случае прецедент? – MadOgre

+1

Это вопрос вкуса и практических проблем. Цель 'compile' заключается в изменении шаблона и возврате функции предварительной ссылки и/или пост-ссылки. Я считаю, что он был там до 'шаблона' и оставался по историческим причинам. Обычно функции 'template' и' controller' и/или link ($ onInit и $ postLink перехватывают контроллер в 1.5+). – estus