11

我正在使用controllerAs語法來避免在我的控制器中使用$ scope湯,並且還使用ui.bootstrap來呈現模態視圖。使用controllerAs語法時,將當前範圍傳遞給modalInstance

我需要打開一個與當前控制器共享相同範圍的modalInstace。在注入範圍,你也許可以這樣做:

var modalInstance = $uibModal.open({ 
     templateUrl: 'addEditModal.html', 
     scope: $scope 
    }); 

然而,由於我沒有注射範圍,並使用controllerAs語法,這是行不通的。

從我發現的情況來看,您需要使用resolve來傳遞數據,但是您必須通過函數明確地傳遞它。有沒有辦法通過整個範圍?

有一堆東西我需要做的模式和傳遞大量的數據似乎矯枉過正。

不想這樣做,因爲它似乎凌亂...

var modalInstance = $modal.open({ 
    templateUrl: 'myModalContent.html', 
    controller: 'ModalInstanceCtrl', 
    resolve: { 
    user: function() { 
     return vm.user; 
    }, 
    something: function() { 
     return vm.something; 
    }, 
    blah: function() { 
     return blah; 
    } 
    } 
}); 

更好的想法?

回答

14

我需要打開與當前控制器共享相同作用域的modalInstace。

莫代爾服務creates inherited scope。和

var modalInstance = $uibModal.open({ 
    templateUrl: 'addEditModal.html', 
    scope: $scope 
}); 

沒有噴射的範圍,而是用於指定模態控制器(否則根範圍將被用作父)父範圍。

由於controllerAs在父控制器上使用,模態控制器將有權訪問其範圍上的繼承對象vm

+1

該解決方案需要將$ scope注入到控制器。這是我們試圖避免的。 – Bendim

+0

@Bendim如答案中所述,它不注入作用域,但指定模態控制器的父作用域。它可以是控制器的'$ scope'或'scope = $ rootScope。$ new()'作用域。 '$ uibModal'的設計就是這樣工作的。誰是'我們'?如果您有類似問題,請隨時發佈反映您特定情況的問題。 – estus

+1

這似乎是答案的一半。然後你必須將$ scope注入到你的模態控制器中,那麼你可以訪問父scope變量作爲$ scope.controllerasname.variable – nuander

8

不知道如果我理解正確的,但我得到它通過傳遞工作/注射的決心參數的當前「controllerAs」

var modalInstance = $uibModal.open({ 
     templateUrl: 'addEditModal.html', 
     controller: 'AudioItemAddEditCtrl as vm', 
     resolve: { 
     parent: function(){ 
      return vm 
     } 
    } 
    }); 

,然後在AudioItemAddEditCtrl ...

var AudioItemAddEditCtrl = function(parent, AudioItemService, $ModalInstance) { 
... 
} 

然後,我可以使用'父'直接訪問父控制器作用域。

希望這可以幫助別人。