2016-07-24 78 views
0

我有一個彈出窗體,它有很多選項卡。無法從子UI訪問父控制器的方法

它的這樣的:

index.js

vm.openCreateOrEditPropertyModal = function (resolveProperty) { 
    var modalInstance = $uibModal.open({ 
     templateUrl: '~/App/tenant/views/propertymanagement/createOrEditPropertyModal.cshtml', 
     controller: 'tenant.views.propertymanagement.createOrEditPropertyModal as vm', 
     resolve: { 
       resolveProperty: function() { 
       return resolveProperty; 
       } 
       } 
       }); 
     }; 

標籤是這樣的:

createOrEditPropertyModal.cshtml

<uib-tabset class="tab-container tabbable-line" type="pills"> 
    <uib-tab heading="@L("PropertyInformation")"> 
     <div ng-include="'~/App/tenant/views/propertymanagement/tabs/propertyForm.cshtml'"></div> 
     </uib-tab> 
</uib-tabset> 

createOrEditPropertyModal.js

(function() { 
    appModule.controller("tenant.views.propertymanagement.createOrEditPropertyModal", [ 
     "$scope", "resolveProperty", "localStorageService", "$uibModalInstance", function ($scope, resolveProperty, localStorageService, $uibModalInstance) { 

      var vm = this; 


      //to close the pop up 
      vm.cancel = function() { 
       $uibModalInstance.close(); 
      }; 
     } 
    ]); 
})(); 

propertyForm.cshtml

<div ng-controller="tenant.views.propertymanagement.tabs.propertyForm as vm"> 
    <button type="button" ng-click="vm.cancel()">@L("Close")</button> 
</div> 

propertyForm.js

(function() { 
    appModule.controller("tenant.views.propertymanagement.propertyForm", [ 
     "$scope", "resolveProperty", "localStorageService", function ($scope, resolveProperty, localStorageService) { 

      var vm = this; 



     } 
    ]); 
})(); 

以上設置工作fine.Now我需要訪問cancel()方法在createOrEditPropertyModal.js文件從子表單(即但是它並沒有被解僱。你能告訴我該怎麼做嗎?我嘗試過這樣的ng-click="$parent.cancel()"。但它不起作用。

回答

1

您可以做vm.cancel()直接位於子表單中,因爲您已在使用controllerAs模式。但在你的情況下,你有兩個控制器別名爲vm它指的是當前的子控制器上下文。更改控制器別名中的任何一個名稱都會使其工作。

解決此問題的最佳方法是將控制器別名更改爲不同的名稱。控制器的評估應該像查看他們的名字一樣,你可以假裝它是哪個控制器。

-

ng-click不工作,因爲cancel方法是不是有內部$parent範圍。你應該做$parent.vm.cancel()。但我不希望你使用$parent,因爲不好的做法。

+0

其實我的設置是這樣的,我已經更新了問題。請參閱。但是'cancel()'方法沒有被解僱。這是由於控制器的名稱相同嗎?我的意思是關於'vm' – Sampath

+0

可能是..請嘗試更改名稱..因爲它必須工作 –

+0

這是因爲您的控制器'propertyForm as vm'將'createOrEditPropertyModal'映射爲vm'。 – fodma1

1

我能想到的三種可能的解決方案:

  1. 這是因爲cancel功能不上$parent範圍,但父控制器上。實現這一目標的方法之一可能是使用的控制器不同的命名:related SO answer

  2. 否則,你可以把cancel功能上$scope變量createOrEditPropertyModal

只要改變createOrEditPropertyModal.js

vm.cancel = function() { 
    $uibModalInstance.close(); 
}; 

$scope.cancel = function() { 
    $uibModalInstance.close(); 
}; 
  • 可以傳遞函數來模態類似於指令:related SO answer
  • +0

    第二種解決方案可能不是因爲http://stackoverflow.com/questions/23780181/angular-ui-modal-can-not-refer-to-parent-scope工作。請讓我知道,我會更新我的答案 – fodma1

    +0

    你能告訴我更多關於第二種選擇嗎?可能是簡單的代碼片段。 – Sampath

    +0

    是的,現在它正在工作。謝謝你。但我認爲這不是處理父母/孩子參考號的好方法嗎?你的想法是什麼?如果我更改控制器的不同名稱,那麼我認爲我必須更改所有的UI組件名稱也不是?當我們考慮可維護性等時,您認爲哪種方法更好? – Sampath