2013-11-25 2 views
1

AngularJS недавно была добавлена ​​поддержка нового «контроллера как» синтаксис, который, кажется, предназначен в качестве замены для $scope:Может ли директива AngularJS обращаться к экземпляру контроллера?

var app = angular.module("example", []); 
app.controller("ExCtrl", function() { 
    this.property = "some value"; 
    /* Previously you would have to inject $scope and use 
    $scope.property = "some value"; */ 
}); 

Когда у вас есть директива, которая возникает в представлении, что имеет контроллер, присоединенный к нему и вы хотите, чтобы обмениваться данными между директивой и моделью, можно предварительно использовать $scope:

app.directive("exDirective", function() { 
    return function (scope) { 
     scope.property2 = "another value"; 
    }; 
}); 

есть ли способ использовать «контроллер в качестве» синтаксиса и позволяют директивы происходят внутри взгляды, используя этот контроллер для доступа к его объем?

+2

«контроллер как» не предназначен для замены, но для увеличения, области ... –

+0

Итак, если в представлении вам нужна директива, которая обращается к модели с контроллера, связанного с представлением, нет смысла использовать «контроллер» -as ", и вы можете также придерживаться' $ scope' (или в конечном итоге некоторые из ваших данных на экземпляре контроллера, а некоторые - в области)? –

+1

Вы можете сделать это в любом случае - как и многие вещи в угловом, есть только руководство и лучшие подходы, а не строгие правила. Модель, которую я отслеживал, - это «поведение контроллера, данных и манипулирования данными по объему». (думаю: функции фильтра, результаты от $ http и т. д.) –

ответ

3

Синтаксис controller as будет размещать контроллер в области с заданным именем. Любая область, которая прототипически наследует эту область, также наследует контроллер.

Fiddle пример: http://jsfiddle.net/j5P77/

директив с изолированной сферы все еще может использовать контроллер с (безвкусный на мой взгляд) $parent сфера.

+0

Я не думаю, что это действительно отвечает на мой вопрос. Посмотрите на [эту скрипку] (http://jsfiddle.net/HFGBW/). Возможно ли получить доступ к данным, присвоенным 'this' в контроллере, из директивы' link'? –

+1

Точно, как я уже сказал, см. Обновленную скрипту: http://jsfiddle.net/HFGBW/1/ (и ваша консоль :) –

+0

Ahh, спасибо! Я думал, что могу ошибаться в твоем ответе. Это то, что я искал, и я не уверен, как я пропустил это, когда раньше я регистрировал 'scope' внутри' link'. –

2

Функции «контроллер как» публикуют ваш контроллер в $ scope с указанием имени. Таким образом, в вашем примере, если вы имели ng-controller="ExCtrl as ctrl" то в вашей директиве вы должны быть в состоянии получить доступ свойство2 используя

scope.ctrl.property2 = "another value"; 

В действительности это не рекомендуемый способ идти об этом, хотя, как это затем плотно пары директивы с вашим контроллером. Лучшим подходом было бы использовать изолированную область и передать свойство через атрибут или использовать совместно используемую службу для обмена данными.

+0

Спасибо. Да, я соглашаюсь на тесно связанную точку. Это был только я, пытаясь лучше понять, как работает «контроллер как», что я сейчас понимаю. –

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