2013-05-17 5 views
5

Ich versuche eine Aktion auszuführen, wenn ein bestimmter Akkordeonabschnitt geöffnet wird. Mein Anwendungsfall ist fast identisch mit diesem question here, nur verwende ich statisch definierte 's anstelle von ng-each.angular-ui bootstrap akkordeon: Wie kann ich das is-open-Attribut richtig beobachten?

Irgendwie kann ich die $ Uhr nicht zu schießen, wenn das ist geöffneten Zustand ändert, kann mir jemand sagen, warum dies nicht funktioniert:

Ausblick:

<accordion close-others="false"> 
    <accordion-group heading="group1" is-open="acc1open"> 
    content 1 
    </accordion-group>  
    <accordion-group heading="group2" is-open="acc2open"> 
    content 2 
    </accordion-group> 
    </accordion> 

Controller:

$scope.acc1open = false; 
    $scope.acc2open = true; 

    $scope.$watch('acc1open', function(){ 
     console.log("watch acc1:" +$scope.acc1open); 
    }, true); 

Hier ist ein Plunker:

http://plnkr.co/edit/Ycms81?p=preview

Es druckt "watch acc1: false" ein einziges Mal, wenn die Seite geladen wird, aber nichts, wenn die Akkordeongruppe geöffnet wird.

+1

Ich versuchte dies und couldn‘ T Finde es heraus .. – lucuma

Antwort

2

Ich habe eine <span> innerhalb des AccordionDemoCtrl div und verändert die offen ist zu $ ​​parent.acc1open

<accordion-group heading="group1" is-open="$parent.acc1open"> 

...

<span ng-click="acc1open = true">Click me to open group 1</span> 

Richtlinien haben ihre eigenen Rahmen zu binden, und die Variablen sind ihre eigenen.

+0

Danke das war es! Aktualisierter Plunker für den Rekord: http://plnkr.co/edit/1lnbTa?p=preview –

+1

Diese Beschreibung war für mich zweifelhaft, also werde ich einen Kommentar hinzufügen, wie ich das gemacht habe. Der Plünderer war die Lösung für mich. – dacopenhagen

+0

Dies ist tatsächlich eine falsche Antwort, Sie sollten keinen einzelnen Wert zu mehreren Is-Open zuordnen. Sieh dir den oben genannten Plünderer an, es funktioniert tatsächlich nicht. – windmaomao

11

Zusammen mit dem Plunker: plnkr.co/edit/1lnbTa?p=preview

Das fand ich für ein Array gearbeitet:

JS

$scope.array = [object1,object2,object3,object4]; 
$scope.isOpen = [false,false,false,false]; 
$scope.$watch('isOpen', function() { 
    console.log("watch isOpen:" + $scope.isOpen); 
}, true); 

HTML (JADE)

accordion-group(ng-repeat='object in array',is-open="$parent.isOpen[$index]") 
    accordion-heading 
    h4 My Heading {{$index}} 
    p My content {{$index}} 
+1

IMHO, sollte dies die akzeptierte Antwort sein. GJ! – Dormouse

+1

Ich stimme dir zu, zumindest in die richtige Richtung. Sie können $ scope.isOpen = [true]; so dass das erste Panel immer offen ist. Und dann füllt es den Rest der Elemente für Sie mit is-open = "isOpen [$ index]" – windmaomao

+0

Um das aktuelle offene Panel zu finden, können Sie _.indexOf ($ scope.isOpen, true) tun, wenn Sie verwende Unterstriche. – windmaomao

Verwandte Themen