2013-12-06 4 views
0

Я переключаюсь с angularJS 1.0 на 1.2, и у меня возникли проблемы с назначением контроллера директиве с чистой областью без определения контроллера в моем html с ng-контроллером.Назначение контроллера из директивы angularjs 1.2

рассмотрим следующий сценарий:

var myApp=angular.module('myApp',[]) 
.controller('parentCtrl',function($scope,$element,$attrs) { 
    $scope.helloworld = function(){             
    console.log('hello world from ParentCtrl controller') 
    } 
}) 

.controller('childCtrl',function($scope,$element,$attrs) { 
    $scope.helloworld = function(){ 

     console.log('hello world from ChildCtrl controller') 

    } 
}) 
.directive('ngParent', function() { 
    return { 
    controller:'ParentCtrl' 
    } 
}) 
.directive('ngChild', function() { 
    return { 
     controller:'ChildCtrl', 
     scope:{}, 
     link:function(scope,element,attrs){ 

     } 
    } 
}) 

И HTML:

<body ng-app="myApp" ng-parent> 
     <button ng-click="helloworld()">Parent Scope click </button> 
     <div ng-child> 
     <button ng-click="helloworld()">Child Scope click </button> 
     </div> 
    </body> 

Прямо сейчас, обе кнопки будет регистрировать "привет мир от контроллера ParentCtrl". Однако, если я изменяю область параметров: {} в область: true в директиве ngChild, она работает, и кнопки вызывают функцию helloworld соответствующих областей. Но это не делает чистой области, как я хочу.

Как сделать чистую область действия в директиве с угловым 1,2, не назначая контроллер на мой взгляд?

Спасибо, Andreas

ответ

0

, потому что вы не создаете новые возможности как директивы используют один и тот же объем и определение функции «HelloWorld» переопределены. так что либо вам нужно изменить имя функции, либо создать новую область,

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

+0

Вы можете добавить контроллеры в свои директивы. Я счел это полезным при организации большей части кода, отличного от UI, назначенного контроллеру, в то время как мой DOM-манипуляционный код находится в обратном вызове link(). В этом случае моя бизнес-логика не может существовать без остальной части пользовательского интерфейса директивы. Это делает намного более чистый код IMHO. – mitch

+0

Как правило, это плохая идея объединить ui и бизнес-логику, но поскольку я не знаю вашего точного сценария, это может быть действительно. –

+0

Спасибо за ваш ответ. Я понимаю, что helloworld перезаписывается, потому что новая область не создается ... Вот почему я использовал код в качестве примера. Я не согласен с тем, что вы должны использовать ng-controller в своем представлении вместо назначения его в директиве. В рамках MVC вы должны иметь возможность создавать html-шаблон с контроллером и моделью, отделенной от HTML. Например. создание должно быть возможным, с возможностью изменения контроллера и опций из директивы вместо изменения каждого экземпляра html этого ... – asprotte

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