С точки зрения хорошей практики AngularJS, вы должны применять принцип разделения интересов, не устанавливая такую сильную зависимость от контроллера, чтобы знать имена функций в директивах и тому подобное.
Одна альтернатива - использовать событие-принципиальный подход, при котором директива отправляет событие, которое захватывается контролируемым и на которое выполняется действие, причем цикл замыкается путем обновления модели.
app.directive("searchableMultiselect", ['$timeout', '$filter', function($timeout, $filter) {
return {
templateUrl: "Templates/SearchableMultiselect.html",
require: 'ngModel',
restrict: "AE",
scope: {
displayAttr: "@", //one way binding & only expression
selectedItems: "=", //two way binding & expects model name
allItems: "=",
readOnly: "=",
addItem: "&",
removeItem: "&", //method binding
},
link: function(scope, element, attrs) {
element.bind('click', function(event) {
event.stopPropagation();
});
scope.updateSelectedItems = function(obj) {
console.log(scope.allMarkets);
scope.$emit("updateSelectedItems", scope.allMarkets);
}
}
}
}])
А в контроллере:
app.controller("ctrl", ['$scope', function ($scope) {
$scope.$on("updateSelectedItems", function (event, allMarkets) {
// Do stuff with data
// Update data model bound to directive if necessary
});
}])
Надеюсь, это имеет смысл:)