2017-04-27 27 views
0

我是Angular的新手,想使用Angular的ui-bootstrap使用Modal(Popup表單)。我正在從Angular bootstrap site中學習。可以看出它利用ControllerAs來控制彈出窗口。Angular - ControllerAs中的函數無法執行

我所面臨的問題是在CTRL功能無法ng-click事件被執行,即使我已經把正確的價值ng-click='ctrl.open()'

使其更清晰,下面我會提供我的代碼。

Controller.js

'use strict'; 

function funcListEmployeeCtrl($scope) { 
    var ctrl = this; 
    ctrl.items = ['item1', 'item2', 'item3']; 
    ctrl.animationsEnabled = false; 
    console.log(ctrl); 
    ctrl.open = function (size, parentSelector) { 
     console.log('selected'); //this is not fired 
     var parentElem = parentSelector ? 
      angular.element($document[0].querySelector('.change-password-modal-container ' + parentSelector)) : undefined; 
    var modalInstance = $uibModal.open({ 
     animation: ctrl.animationsEnabled, 
     ariaLabelledBy: 'modal-title', 
     ariaDescribedBy: 'modal-body', 
     templateUrl: 'myModalContent.html', 
     controller: 'ModalInstanceCtrl', 
     controllerAs: 'ctrl', 
     size: size, 
     appendTo: parentElem, 
     resolve: { 
      items: function() { 
       return ctrl.items; 
      } 
     } 
    }); 
} 

angular.module('listEmployee') 
    .controller('listEmployeeCtrl', ['$scope', funcListEmployeeCtrl]) 
    .controller('ModalInstanceCtrl', function ($uibModalInstance, items) { 
     var ctrl = this; 
     ctrl.items = items; 
     ctrl.selected = { 
      item: $ctrl.items[0] 
     }; 

     ctrl.ok = function() { 
      $uibModalInstance.close($ctrl.selected.item); 
     }; 

     ctrl.cancel = function() { 
      $uibModalInstance.dismiss('cancel'); 
     }; 
}); 

注意,即使是console.log('selected');不會觸發。因此,可以得出結論,ng-click不能訪問該功能。

View.html

... 
<tbody> 
    <tr ng-repeat="emp in data.employees|orderBy:orderByField:reverseSort|filter:{ Name: search_value }"> 
     <td>{{emp.SalesmanId}}</td> 
     <td>{{emp.Name}}</td> 
     <td>{{emp.Address}}</td> 
     <td>{{emp.Phone}}</td> 
     <td>{{emp.Email}}</td> 
     <td ng-click='ctrl.open()'>{{emp.Username}}</td> 
     <td>{{emp.Role}}</td> 
    </tr> 
</tbody> 
... 

我所試圖做的是開放的,每當用戶點擊用戶名小區的模式。 HTML工作正常,因爲我試圖將ng-click更改爲$scope中的函數,並且它正在工作。此外,console.log(ctrl);顯示的內容,所以我相信ctrl對象設置。下面我提供日誌的截圖。

ctrl object

注意,我DevTools Chrome的警告,我不知道如何擺脫它(我用.min.js,而不是.map)。但是,我不認爲這是問題。 enter image description here

我不確定我出錯的地方。任何幫助和指導,將不勝感激。

+0

當你能夠在沒有前面的「ctrl」的情況下訪問「data.employees」時,那麼它意味着你可以在沒有前面的「ctrl」的情況下訪問「open」。你能試一下嗎? –

+0

您能告訴我們您使用controllerAs的位置嗎? –

+0

@GiovaniVercauteren當然,這是當我初始化'modalInstance'我會更新我的問題。 –

回答

1

你似乎混淆了你的當前控制器與modalController。您聲明controllerAs: 'ctrl'爲您的模式,但這並不意味着您可以在當前控制器中使用ctrl

您有兩個控制器,listEmployeeCtrlModalInstanceCtrl。只有第二個控制器(ModalInstanceCtrl)可以在其模板中使用ctrl

如果你想使用ctrllistEmployeeCtrl以及你需要的ng-controller指令添加到view.html。

使用示例代碼:

<div ng-controller="listEmployeeCtrl as ctrl"> 
    ... 
    <tbody> 
     <tr ng-repeat="emp in data.employees|orderBy:orderByField:reverseSort|filter:{ Name: search_value }"> 
      <td>{{emp.SalesmanId}}</td> 
      <td>{{emp.Name}}</td> 
      <td>{{emp.Address}}</td> 
      <td>{{emp.Phone}}</td> 
      <td>{{emp.Email}}</td> 
      <td ng-click='ctrl.open()'>{{emp.Username}}</td> 
      <td>{{emp.Role}}</td> 
     </tr> 
    </tbody> 
    ... 
</div> 

OR

,你描述你的路線,你可能有沿

.when('...', { 
    controller: 'listEmployeeCtrl', 
    templateUrl: '.../view.html' 
}) 

有線條的東西,你可以添加controllerAs語法:

.when('...', { 
    controller: 'listEmployeeCtrl', 
    controllerAs: 'ctrl', 
    templateUrl: '.../view.html' 
}) 
+0

謝謝你的迴應!通過'controller:'路由控制器定義控制器與html元素,即'ng-controller =「listEmployeeCtrl」'有什麼區別? –

+0

ngController語法允許您輕鬆添加子控制器,而使用路由語法則不會。功能上,沒有區別。 –

+0

是的,你是對的!該功能現在可以訪問。只需要修復模式以使其工作。謝謝你的解釋和你的時間伸出援助之手! –

0

您需要傳遞模式ID以使其打開,這是缺少的!

+0

感謝您的回覆!我應該把它放在哪裏?請注意,即使'console.log('selected');'也沒有被觸發。我將更新添加該信息。 –

+0

您正在使用模板網址,但尚未在.cshtml中定義。 – geminiousgoel

+0

在.cshtml文件的tbody上方使用

  • 11. 無法執行聚合函數
  • 12. 無法在UIWebView內執行javascript函數?
  • 13. 使用controllerAs語法
  • 14. jQuery無限函數執行
  • 15. 用'ControllerAs'語法使用ng-submit調用一個函數
  • 16. AngularJS ng-click無法與$ routeProvider中的controllerAs一起使用
  • 17. 無法通過函數指針執行類函數C++
  • 18. Angular 2無法在XMLHttpRequest上執行打開:無效的URL
  • 19. 無法理解在isEmpty函數中執行棧函數的返回語句
  • 20. ui.router,$ scope和controllerAs
  • 21. 無法執行參數
  • 22. $ http成功函數不會在Angular js中執行
  • 23. 無法獲取Oracle包函數在c#中執行
  • 24. Jquery回調函數在post中無法執行
  • 25. 無法執行mongo:在erlang中查找函數
  • 26. Web SQL事務在JavaScript函數中無法正確執行
  • 27. TO_DATE函數無法在Sql查詢中執行
  • 28. 無法刪除Angular JS中的行
  • 29. 在swift中執行函數執行
  • 30. 數學函數庫中的除法函數如何處理精度誤差,除法運算符無法執行?