AngularJS: передать объект из директивы в контроллер

В моей директиве я создаю экземпляр объекта.

Я хотел бы передать этот объект в область действия контроллера, который я ассоциирую с директивой. Как я могу это сделать?

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

Я знаю, что объект scope в директиве предназначен для передачи значений, указанных в HTML, я написал его таким образом, чтобы помочь вам понять, что я пытаюсь сделать.

angular.module('test', [])

.controller('test', ['$scope', function($scope) {
    alert($scope.obj); //Needs to contain {value: 'bla'}

}])

.directive('pTest', ['$compile', function($compile) {
    var object = {value: 'bla'};

    return {
        scope: {
            obj: object //how can I do that?
        },
        controller: 'test'
    };
}]);

2 ответа

Решение

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

.directive('pTest', ['$compile', function($compile) {
    var object = {value: 'bla'};

    return {
        controller: 'test',
        link: function(scope, elements, attrs, controller) {
           scope.obj = object;
           // or
           controller.obj = object;
        }

    };
}]);

Теперь предположим, что вы не хотите изолировать вашу область видимости, используя член "scope" в ответе на вашу директиву. Из вашего примера я не думаю, что вы на самом деле хотите изолированную область. (Независимо от того, функция связи будет работать там тоже.)

Вы можете иметь два решения

Решение 1: используйте '=' в изолированной области видимости, это связывает локальное / директивное свойство области видимости с родительским свойством области видимости.

 .directive('ptest', ['$compile', function($compile) {
        var object = {value: 'changed value'};

        return {

          scope: {
                iobj:"="
            },
          template : "<div>{{iobj.value}}<div>",

             link: function(scope,elem,attr){
             scope.iobj=object ;
          }
        };
    }]);

в HTML

 <div ng-controller="testCtrl">
  <div ptest iobj="object"></div>
</div>

Решение 2: используйте службу $controller и сделайте testCtrl в качестве родительского и скопируйте всю его область в область контроллеров

.directive('ptest', ['$compile', function($compile,$controller) {
                var object = {value: 'changed value'};

                return {


                     controller:function($scope,$controller){

                    $controller('testCtrl', {$scope: $scope});
                       console.log($scope.object.value);
                       $scope.object = object;
                     }
                };
            }]);

рабочий пример для решения "=" 1:

angular.module('test',[])
.controller('testCtrl',function($scope){


  $scope.object = {value:'intial value'};



})



.directive('ptest', ['$compile', function($compile) {
        var object = {value: 'changed value'};

        return {
          //replace:true,
          scope: {
                iobj:"="
            },
          template : "<div>{{iobj.value}}<div>",
            
             link: function(scope,elem,attr){
             scope.iobj=object ;
          }
        };
    }]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="test"  ng-controller="testCtrl">
  {{object.value}}
   <div ptest iobj="object"></div>
</div>

Рабочий пример для решения 2 с $controller

  angular.module('test',[])
    .controller('testCtrl',function($scope){


      $scope.object = {value:'intial value'};



    })



    .directive('ptest', ['$compile', function($compile,$controller) {
            var object = {value: 'changed value'};

            return {
              
                
                 controller:function($scope,$controller){
                 
                $controller('testCtrl', {$scope: $scope});
                   console.log($scope.object.value);
                   $scope.object = object;
                 }
            };
        }]);
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="test"  ng-controller="testCtrl">
      {{object.value}}
       <div ptest ></div>
    </div>

Другие вопросы по тегам