Búsqueda de sitios web

javascript - ¿Cómo usar angular-ui-bootstrap (modales) en typescript?


Me gustaría editar algunos datos de una tabla usando un modal. Hay varias interfaces en las definiciones de TypeScript para angular-ui-bootstrap de definitelyTyped, sin embargo, no están documentadas y no puedo encontrar ningún ejemplo sobre cómo usarlas.

  • IModalScope
  • IServicioModal
  • InstanciaDeServicioIModal
  • ConfiguraciónModal
  • IServicioPilaModal

https://github.com/borisyankov/DefinitelyTyped/blob/master/angular-ui-bootstrap/angular-ui-bootstrap.d.ts#L146

Lo que me gustaría lograr es algo así:

¿Estoy en lo cierto al suponer que tanto ItemsListController como ItemDetailModalController necesitan una instancia del mismo scope para poder intercambiar los datos? ¿Y cómo puedo definir el controlador y la plantilla para la directiva modal usando las interfaces anteriores?

Ya encontré este ejemplo que no es de TypeScript aquí: https://angular-ui.github.io/bootstrap/#/modal

Sin embargo, como principiante me cuesta entender lo que está pasando si las muestras ponen todo en un solo archivo sin separar las preocupaciones.

Respuesta #1

La instancia inyectada por Angular será del tipo ng.ui.bootstrap.IModalService.

Y dado que estás utilizando la sintaxis «controller as», no hay necesidad de empezar a usar $scope aquí, en su lugar puedes usar resolve como se muestra en el ejemplo del modal de angular-ui.

Aquí está el código de ejemplo:

class ItemsListController {
    static controllerId = 'ItemsListController';
    static $inject = ['$modal'];

    data = [
        { value1: 'Item1Value1', value2: 'Item1Value2' },
        { value1: 'Item2Value1', value2: 'Item2Value2' }
    ];

    constructor(private $modal: ng.ui.bootstrap.IModalService) { }

    edit(item) {
        var options: ng.ui.bootstrap.IModalSettings = {
            templateUrl: 'modal.html',
            controller: ItemDetailController.controllerId + ' as modal',
            resolve: {
                item: () => item // <- this will pass the same instance 
                                 // of the item displayed in the table to the modal
            }
        };

        this.$modal.open(options).result
            .then(updatedItem => this.save(updatedItem));
            //.then(_ => this.save(item)); // <- this works the same way as the line above
    }

    save(item) {
        console.log('saving', item);
    }
}

class ItemDetailController {
    static controllerId = 'ItemDetailController';
    static $inject = ['$modalInstance', 'item'];

    constructor(private $modalInstance: ng.ui.bootstrap.IModalServiceInstance, public item) { }

    save() {
        this.$modalInstance.close(this.item); // passing this item back 
                                              // is not necessary since it 
                                              // is the same instance of the 
                                              // item sent to the modal
    }

    cancel() {
        this.$modalInstance.dismiss('cancel');
    }
}

Artículos relacionados