2013-10-28 5 views
0

Как создать экземпляр пользовательского контроллера из кода и сохранить наследование области. Другими слова, я хочу сделать что-то вроде этого:Мгновенный пользовательский угловой контроллер

var controller = 'myCtrl'; 
var html = '<p>{{value}}</p>'; 
var validScope= $scope.$new({ 
    value : 'Hello, custom controllers' 
}); // Or something like this to get valid scopes inheritance 
$(document.body).append(instantiate(controller, html, validScope)); 

Так что мне нужен два ответа: как создать экземпляр пользовательского контроллера и как это сделать, как угловые дела.

UPD. Я попытался сделать это следующим образом:

$compile('<div ng-controller="myCtrl">'+html+'</div>')(validScope); 

Контролер был создан. Но фиксированные значения не были привязаны.

+0

У вас есть опечатка, я думаю. 'myCtrlScopeValue' vs' myCtrlValue' –

+0

Спасибо, исправлено. Но у меня нет опечатки в моем тестовом коде. –

+0

Почему вы хотите сделать это так? Где вы также используете этот код? Если вы сделаете это из директивы, вы можете использовать угловую форму для компиляции, которая будет автоматически создавать контроллер – charlietfl

ответ

1

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

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

Создайте абстрактный контроллер, который задает параметры конструктора контроллера и изолирует остальные зависимости.

module.factory('AbstractCtrl', ['dependencies...', function (dependencies...) { 
    var ctrl = function($scope) { 
      // Do controller setup. 
    }; 

    return ctrl; 
}]); 

Теперь создайте реализацию контроллера на основе абстрактного

module.controller('CtrlImpl', ['$scope', 'AbstractCtrl', function ($scope, AbstractCtrl) { 
    // Initialize the parent controller and extend it. 
    var AbstractCtrlInstance = new AbstractCtrl($scope); 
    $.extend(this, AbstractCtrlInstance); 
    // … Additional extensions to create a mixin. 
}]); 

Теперь, когда у вас есть контроллер с минимально определенного конструктора для создания экземпляра контроллера нужно просто позвонить впрыскивать $ контроллера и сделать следующее:

$controller('CtrlImpl', {$scope: $scope})); 
+0

Удовлетворение интересов. Но мне нужно связать новый экземпляр контроллера с новым узлом DOM. –

1

Я думаю, что лучший подход заключается в том, чтобы выставить функцию в области для получения вашего контроллера. (ngController может принимать строку или функцию) Допустим, у вас есть различные значения, которые нужны различные конструкторы ... что-то смутно, как это:

<div ng-repeat="item in items"> 
    <div ng-controller="controllerFor(item)"> 
    // whatever 
    </div> 
</div> 

Это controllerFor функция будет знать, как сделать отображение для вас. Надеемся, вы можете избежать использования $compile все вместе.

+0

Не знал, что контроллер может быть оценен. Благодарю. Это хорошо для контроллеров, которые вы уже загрузили. Но что делать с контроллерами, которые должны быть загружены с помощью requirejs или другим способом? –

+0

Я полагаю, что если вы загружаете контроллеры через RequireJS, вам нужно будет написать более сложный код.Похоже на дополнительное усложнение для меня, чтобы сделать загрузку контроллера асинхронной, поэтому я никогда не понимал преимущества использования RequireJS в Angular. –

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