2014-08-31 55 views
6

我想做一個模式,可以從應用程序的多個地方實例化。從這裏給出的例子:Angular directives for Bootstrap模態控制器與實例化模態的控制器在同一個文件中。我想將模式控制器從「應用程序」控制器中分離出來。角度用戶界面模式與控制器在單獨的js文件

的index.html:

<!DOCTYPE html> 
<html ng-app="modalTest"> 

    <head> 
    <link rel="stylesheet" type="text/css" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> 
    </head> 

    <body ng-controller="modalTestCtrl"> 
    <button ng-click="openModal()">Modal</button> 

    <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.min.js"></script> 
    <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.10.0/ui-bootstrap.min.js"></script> 
    <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.10.0/ui-bootstrap-tpls.min.js"></script> 
    <script type="text/javascript" src="modalTest.js"></script> 
    </body> 

</html> 

控制器:

var app = angular.module('modalTest', ['ui.bootstrap']); 

app.controller('modalTestCtrl', ['$scope', '$modal', function($scope, $modal) { 
    $scope.openModal = function() { 
     var modalInstance = $modal.open({ 
      templateUrl: 'modal.html', 
      controller: 'modalCtrl', 
      size: 'sm' 

     }); 
    } 
}]); 
// I want this in another JavaScript file... 
app.controller('modalCtrl', ['$scope', function($scope) { 
    $scope.hello = 'Works'; 
}]); 

modal.html:

<div ng-controller="modalCtrl"> 
    <div class="modal-header"> 
     <h3 class="modal-title">I'm a modal!</h3> 
    </div> 
    <div class="modal-body"> 
     <h1>{{hello}}</h1> 
    </div> 
    <div class="modal-footer"> 
     <button class="btn btn-primary" ng-click="ok()">OK</button> 
     <button class="btn btn-warning" ng-click="cancel()">Cancel</button> 
    </div> 
</div> 

有什麼辦法把modalCtrl在另一個JavaScript文件,不知何故注入控制器(modalCtrl)到modalTestCtrl?

BR

+0

我猜你可能想使用一個指令,除非有一個特定的原因,你必須使用控制器 – tommybananas 2014-08-31 22:29:53

+0

可以說模式是一個登錄模式,當會話超時模態必須顯示。然後模態控制器必須擁有所有的登錄邏輯 – user3594184 2014-08-31 22:33:40

回答

9

當然,你可以做到這一點。首先你應該使用一個函數聲明。

// modalCtrl.js 
// This file has to load before modalTestCtrl controller 
function modalCtrl ($scope) { 
    $scope.hello = 'Works'; 
}; 

然後,更改modalTestCtrl這樣的:

app.controller('modalTestCtrl', ['$scope', '$modal', function($scope, $modal) { 
$scope.openModal = function() { 
    var modalInstance = $modal.open({ 
     templateUrl: 'modal.html', 
     controller: modalCtrl, //This must be a referance, not a string 
     size: 'sm' 

    }); 
} 
}]); 

隨着上述變化,你的代碼有工作。

+0

謝謝你的作品 – user3594184 2014-08-31 22:42:29

+0

我很樂意幫助你。 – turhanco 2014-08-31 23:35:54

+0

迷你警告:modalCtrl函數必須在modalCtrl.js中直接聲明,而不是自執行函數:D(它困擾了我15分鐘,直到我注意到:D) – 2016-03-04 16:15:32