2017-02-20 2 views
0

У меня есть довольно простое указание, что я хотел бы быть в состоянии выполнить обратный вызов с параметрами, поставляемых с помощью директивы и объема. Например:AngularJS Директива Run Ответный С Params

<div ng-repeat="user in users"> 
    <div sample="..." callback="welcome(user, $message)"> 
    </div> 
</div> 

У меня возникли проблемы с использованием $parse, чтобы справиться с этим. Моя директива образца выглядит следующим образом:

app.directive('sample', ['$parse', function ($parse) { 
    return { 
    restrict: 'A', 
    scope: {}, 
    link: function (scope, element, attrs) { 
     // ... 
     function greet() { 
     var callback = $parse(attrs.callback); 
     callback(scope, { $message: 'Howdy' }); 
     } 
    }, 
    }, 
}]); 

Однако, несмотря на получение функции от $ разбора - выполнение функции никогда не приводит в своей приветственной функции (определенной в контроллере) называют (примечание: на угловом 1.5.x) , Я предполагаю, что область как-то ошибочна (что она использует изолированную область видимости вместо родительской области), но мне нужна изолированная область (упрощенная, например). Что я делаю не так?

+0

Вы уверены, что вам нужно '$ parse' и директивы в целом? Если это для одного контроллера, вы можете определить '$ scope.greet' в контроллере. –

+0

Директива используется для нескольких контроллеров, а «обратный вызов» имеет разные параметры (и необязательное «$ message») в определении для них (поэтому это невозможно). – Stussa

ответ

2

Вы можете использовать scope.$parent в качестве параметра для вашего $parse вызова? Вы также можете обернуть с помощью $scope.$apply(function() { ... });.

+0

Я не думаю, что выделенные области имеют доступ к любому из родителей – Phil

+0

Это работает. Это где-то документально? – Stussa

+1

@phil Изолированный объект $ parent всегда ссылается на родительскую область. Изолированный означает, что он не наследует прототипно из родительской области - * NOT *, что $ parent не определен. –

0

Вы можете использовать & isolate scope binding. Я бы также предоставить user объект вашей директивы

return { 
    restrict: 'A', 
    scope: { 
    user: '<', 
    callback: '&' 
    } 
    link: function(scope) { 
    // ... 
    function greet() { 
     scope.callback({ 
     user: scope.user, 
     $message: 'Howdy' 
     }) 
    } 
    } 
} 

и

<div sample="..." user="user" callback="welcome(user, $message)"> 
+0

Это решение добавляет довольно сильную связь между пользователем и директивами (я стараюсь избегать и сделайте директиву как можно более общей). Я нацелен на директиву, гораздо более близкую к «ng-click» - где директива заполняет некоторые ключевые параметры, но в остальном не нужно знать о внешних событиях. Я в идеале нужно поддерживать такие вещи, как: 'обратного вызова = "Добро пожаловать()" и' обратного вызова = "Добро пожаловать (пользователь)" и 'обратного вызова = "Добро пожаловать (пункт, $ сообщение)" и' обратного вызова = "Добро пожаловать (item, user, $ message) ". – Stussa

+0

@Stussa это не плотная связь, она просто становится частью API директивы. В любом случае, я рад, что вы нашли решение, которое работает для вас – Phil

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