2014-11-07 3 views
1

Я хочу, чтобы вызвать функцию, определенную в директиве, как раз обратное this stackoverflow questionAngular.js называют директиву функции в контроллере

Я попробовал это, но не работает.

app.directive('myDirective', function() { 
    return { 
     link: function(scope, element, attrs) { 
      scope.someDirectiveFn = function(arg) { 
       return "in directive"; 
      }; 
     }, 
    } 
}); 

function MyCtrl($scope) { 
    alert($scope.someDirectiveFn()); 
} 

Возможно ли это? как я мог его получить? это плохая практика?

EDIT

Я получил так:

.controller('MyCtrl', function($scope) { 
    alert($scope.func()); 
}) 

.directive('myDirective', function() { 
    return { 
     controller: function($scope, $element){ 
     $scope.func = function() { 
      return "text"; 
     }; 
     } 
    } 
}); 

ответ

2

Вы можете использовать систему событий для достижения этой цели.

Во-первых, испускайте настраиваемое событие в своей области с вашими параметрами. Во-вторых, прислушайтесь к сфере действия вашей директивы с угловым методом $ on.

Работает plunker.

UPDATE

На основе вашего обновления, связь событий не подходит к вашей проблеме.

Как насчет передачи объекта в директиву с использованием двухсторонней привязки и определения someDirectiveFn в этом объекте? Таким образом, вы можете передавать аргументы и возвращать значения из него.

app.controller('MyCtrl', function($scope) { 
    $scope.shareObject = {}; 

    $scope.invokeDirectiveMethod = function() { 
    if (angular.isFunction($scope.shareObject.someDirectiveFn)) { 
     $scope.message = $scope.shareObject.someDirectiveFn('from controller'); 
    } 
    }; 
}) 

.directive('myDirective', function() { 
    return { 
    scope: { 
     'shareObject': '=' 
    }, 
    link: function(scope, element, attrs) { 
     scope.shareObject.someDirectiveFn = function(arg) { 
     return arg + ' from parameter'; 
     }; 
    }, 
    } 
}); 

Обновлено plunker.

+0

$ emit неплохо, но это не может помочь мне, когда мне нужно вернуть значение из директивы. Я отредактировал мой вопрос, чтобы лучше объяснить. – Andres

+0

Итак, я обновил свой ответ на основе этого. – halilb

+0

Он работает, спасибо большое. У меня есть другой подход (вопрос проверки), не могли бы вы рассказать мне, что вы думаете об этом? что лучше? лучшая практика? – Andres

0

Я предполагаю, что вы хотите иметь функцию, которая разделена между директивой и контроллером, скажем?

Если это так, как о создании службы и введении службы в директивы и ctrl. Таким образом, вам нужно будет создать его только один раз.

app.service('sharedFucntionService', function() { 
    return { 
     someFn : function (arg) { 
      alert(arg + " in directive") 
     } 
    } 
}); 

Инъекционное службу в директиву

app.directive('myDirective',function(sharedFucntionService){ 
    return { 
     link: function (scope, element, attrs) { 
      // do something with sharedFucntionService 
     } 
    } 

});

Вводить службу в контроллер, а функции MyCtrl ($ области видимости, sharedFucntionService) { ...... }

+0

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

1

, которого не опубликовать свой HTML код, поэтому я предполагаю, что пользовательская директива б/у IN MyCtrl. Это не работает из-за выполнения функций.

Функции контроллера всегда выполняются перед функциями связи.

Here - отличная статья о различиях.

Так что, если вы хотите, чтобы ваш контроллер, чтобы иметь возможность вызывать функцию в директиве вы можете транслировать события (например, в ответ halilb), либо сделать директиву слушать конкретные значения области видимости, например:

app.directive('myDirective', function() { 
    return { 
     link: function(scope, element, attrs) { 
      scope.$watch("message", function() { console.log(message); }); 
     }, 
    } 
}); 

function MyCtrl($scope) { 
    $scope.message = "Hello Directive"; 
} 
+0

Хорошая статья, но мне нужна директива, чтобы вернуть некоторую ценность. Я отредактировал мой вопрос, чтобы лучше объяснить. – Andres

+0

@ Andres - Ну, почему вы хотите добавить эту функцию в директиву? Вы бы поместили его только в ссылку функции директивы, если вы хотите манипулировать директивами DOM с вашего контроллера. В противном случае просто определите функцию в контроллере. – Jonas

+0

Вы хотите определить это в контроллере директивы? что-то вроде http://plnkr.co/edit/GzJ8LIbhLh17XW9e2XYT?p=preview ?? – Andres

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