2014-07-01 19 views
6

Jestem całkiem nowy w dyrektywach Angular i mam wiele problemów z uzyskaniem tego, co chcę. Oto podstawy, co mam:Dyrektywa AngularJs: metoda wywołania z zakresu nadrzędnego w szablonie

Kontroler:

controller('profileCtrl', function($scope) { 
    $scope.editing = { 
    'section1': false, 
    'section2': false 
    } 
    $scope.updateProfile = function() {}; 
    $scope.cancelProfile = function() {}; 
}); 

dyrektywa:

directive('editButton', function() { 
    return { 
    restrict: 'E', 
    templateUrl: 'editbutton.tpl.html', 
    scope: { 
     editModel: '=ngEdit' 
    } 
    }; 
}); 

szablonu (editbutton.tpl.html):

<button 
    ng-show="!editModel" 
    ng-click="editModel=true"></button> 
<button 
    ng-show="editModel" 
    ng-click="updateProfile(); editModel=false"></button> 
<button 
    ng-show="editModel" 
    ng-click="cancelProfile(); editModel=false"></button> 

HTML:

<edit-button ng-edit="editing.section1"></edit-button> 

Jeśli nie jest jasne, chcę, aby znacznik <edit-button> zawierał trzy różne przyciski, z których każdy wchodzący w interakcje z dowolną właściwością zakresu został przekazany do ng-edit. Po kliknięciu powinni zmienić tę właściwość, a następnie wywołać odpowiednią metodę zasięgu.

Sposób, w jaki jest teraz, kliknięcie przycisków prawidłowo zmienia wartości $scope.editing, ale metody updateProfile i cancelProfile nie działają. Mogę być daleko od tego, jak właściwie używać dyrektyw, ale mam problem ze znalezieniem przykładu online, aby pomóc mi osiągnąć to, co próbuję zrobić. Każda pomoc będzie doceniona.

Odpowiedz

15

Jednym ze sposobów byłoby wywołanie funkcji za pomocą $parent.

<button ng-show="editModel" ng-click="$parent.cancelProfile(); editModel=false">b3</button> 

Demo

Innym sposobem (i chyba lepszy sposób), należy skonfigurować samodzielnie zakres swojej dyrektywie, aby zawierać odnośniki do tych funkcji kontrolera:

app.directive('editButton', function() { 
    return { 
    restrict: 'E', 
    templateUrl: 'editbutton.tpl.html', 
    scope: { 
     editModel: '=ngEdit', 
     updateProfile: '&', 
     cancelProfile: '&' 
    } 
    }; 
}); 

Następnie można przejść do poszczególnych funkcji przez HTML:

<edit-button ng-edit="editing.section1" update-profile='updateProfile()' cancel-profile='cancelProfile()'></edit-button> 

Demo

+0

Świetnie, dzięki. Jestem skłonny użyć twojego pierwszego przykładu, ponieważ obie metody będą zawsze takie same dla różnych dyrektyw i zmniejszą obce treści HTML. Co sprawia, że ​​mówisz, że druga droga to "lepszy sposób?" –

+1

@futurityverb, Druga metoda jest bardziej ogólna. Jeśli chcesz mieć instancję dyrektywy o nieco innym zachowaniu, możesz po prostu przekazać inną metodę, która powinna zostać wywołana. Ponadto, jeśli zaczniesz zagnieżdżać dyrektywę w innych dyrektywach, '$ parent' może już nie odwoływać się do zakresu kontrolera, ale do innego zakresu pośredniczącego. – Jerrad

+1

Pchnął mnie we właściwym kierunku, ale co jeśli chcę przekazać argumenty do metod za pomocą twojego drugiego przykładu? –

Powiązane problemy