2015-02-16 20 views
10

Desidero annullare la modifica scheda/l'interruttore del pannello quando l'utente fa clic su un'altra scheda e scopro che le modifiche nel pannello corrente non vengono salvate.Nelle schede di bootstrap angolari, come annullare il cambio di tabulazione?

Uso l'attributo deselect() dell'elemento <tab>, documentato qui http://angular-ui.github.io/bootstrap/#tabs, per attivare una funzione nel mio controller e in cui determino che non devo cambiare scheda. Significato: non voglio deselezionare questo e selezionare l'altro utente su cui si è fatto clic.

Come posso realizzare questo? preferibilmente dall'interno del controller o in altro modo?

Non posso semplicemente fare $ event.stopPropagation() poiché non ho un evento $ qui ... cosa mi manca?

Plunker isolare il problema: http://plnkr.co/edit/fj5y4WQ4oaEI7FPf2Ilh?p=preview

risposta

-3

Applicare ng-click direttiva per ciascuna scheda:

<tab ng-click="checkChange($event)"> 

e poi preventDefault();:

$scope.checkChange = function($e) { 
    // check if tab can be changed 
    $e.preventDefault(); 
}; 
+0

ho provato, ma $ e non è definito, quindi ottengo: "TypeError: Impossibile leggere la proprietà 'preventDefault' di undefined" C'è un "evento" definito, però, ma t cappello è un po 'globale e facendo preventDefault() su di esso non mi aiuta. Non sono sicuro di quale impostazione predefinita sto impedendo di utilizzare quello. Passare $ event a selezionare e deselezionare dà indefinito all'interno del controller. Rifiuti sull'esempio stai riferendo a ciò che mostri qui? o c'è qualche esempio funzionante di questo là fuori? – wojjas

+0

BTW grazie per la risposta rapida. Si noti inoltre che deselezionare prima gli incendi, quindi selezionare. Penso che dovrei cancellare su deselect. – wojjas

+0

la mia risposta aggiornata ti è d'aiuto? – DonJuwe

0

La mia soluzione per evitare che il cambiamento scheda stava usando il costruito nella bandiera disabilitata. Se aggiungi un gestore di click ng alla scheda, puoi comunque reagire agli eventi. Questo funziona se lo stile disabilitato non è un problema per te - nel tuo caso d'uso questo potrebbe essere il caso.

<tab disabled="true" ng-click="warnUserNotSavedChanges()"> 
0

Si prega di utilizzare sotto il codice per questa soluzione di schede, ha funzionato per me.

//our root app component 
 
import {Component, NgModule, VERSION} from '@angular/core' 
 
import {BrowserModule} from '@angular/platform-browser' 
 
import { TabsModule } from 'ngx-bootstrap'; 
 

 
@Component({ 
 
    selector: 'my-app', 
 
    template: ` 
 
    <tabset> 
 
    <tab heading='Tab 1'>Tab 1 content</tab> 
 
    <tab> 
 
     <template tabHeading> 
 
     <div (click)="tryToSwitch($event)"> 
 
      Tab 2 
 
     </div> 
 
     </template> 
 
     Tab 2 content 
 
    </tab> 
 
    </tabset> 
 

 
    `, 
 
}) 
 
export class App { 
 
    tryToSwitch(e) { 
 
    let result = confirm('Are you sure?'); 
 
    if(!result) { 
 
     e.stopPropagation(); 
 
    } 
 
    } 
 
} 
 

 
@NgModule({ 
 
    imports: [ BrowserModule, TabsModule.forRoot() ], 
 
    declarations: [ App ], 
 
    bootstrap: [ App ] 
 
}) 
 
export class AppModule {}

0

Supponiamo di avere 3 schede e desidera che la terza linguetta di essere cliccabile. Quindi è necessario aggiungere un attributo deselect alle schede selezionabili, in modo che quando si deseleziona l'evento, abbiano controllato la scheda su cui si sta tentando di passare e se si tratta della terza scheda, opzione di tabulazione impedita.

Questo funziona solo nelle versioni successive di ui-bootstrap, intorno 0,12-0,14, non si può dire esattamente:

template.html

<uib-tabset class="tab-animation" active="activeTab"> 
    <uib-tab index="0" heading="Overview" id="overview" deselect="checkTab($event, $selectedIndex)"></uib-tab> 
    <uib-tab index="1" heading="Details" id="details" deselect="checkTab($event, $selectedIndex)"></uib-tab> 
    <uib-tab index="2" heading="Download" id="download"></uib-tab> 
</uib-tabset> 

controller.js

// Downloads tab shouldn't be clickable 
$scope.checkTab = function($event, $selectedIndex) { 
    // $selectIndex is index of the tab, you're switching to 
    if ($selectedIndex == 2) { // last tab is non-switchable 
     $event.preventDefault(); 
    } 
};