2016-07-24 5 views
0

Ich habe ein Popup-Formular, in dem viele Registerkarten vorhanden sind.Zugriff auf die Methode des übergeordneten Controllers über die untergeordnete Benutzeroberfläche nicht möglich

Sein wie folgt aus:

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; 
       } 
       } 
       }); 
     }; 

Tabs sind wie folgt aus:

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; 



     } 
    ]); 
})(); 

Above aufgebaut arbeitet fine.Now I cancel() Methode zugreifen müssen auf der createOrEditPropertyModal.js-Datei von dem untergeordneten Formular (d. H. propertyForm.cshtml). Aber es wird nicht gefeuert.Können Sie mir sagen, wie das geht? Ich habe es versucht ng-click="$parent.cancel()". Aber es funktioniert nicht.

Antwort

1

Sie könnentundirekt in einem untergeordneten Formular, da Sie bereits Controller als Muster verwenden. Aber in Ihrem Fall haben Sie beide Controller Alias ​​als vm es bezieht sich auf aktuelle Kind Controller-Kontext. Wenn Sie den Namen eines der beiden Controller-Aliasnamen ändern, funktioniert es.

Der beste Weg, um dieses Problem zu lösen, würde Ihren Controller-Alias ​​auf einen anderen Namen ändern. Controller aaliases sollte wie durch den Blick auf ihren Namen ist, können Sie vorgeben, welcher Controller es ist.

-

Die ng-click funktioniert nicht, weil cancel Methode nicht da innerhalb $parent Umfang ist. Sie sollten $parent.vm.cancel() tun. Aber ich würde nicht bevorzugen, dass Sie $parent auf Sicht verwenden, weil schlechte Praxis.

+0

Eigentlich meine Einrichtung ist so. Ich habe die Frage aktualisiert. Bitte beachten Sie das. Aber diese 'cancel()' Methode wird nicht gefeuert.Ist das wegen des gleichen Namens für die Controller? Ich meine über die 'vm' – Sampath

+0

Könnte sein .. Versuchen Sie den Namen zu ändern .. auf der Ansicht muss es funktionieren –

+0

Es ist, weil Ihr Controller' propertyForm als vm' Shadowing 'createOrEditPropertyModal als vm'. – fodma1

1

Ich denke an drei können mögliche Lösungen:

  1. Es ist, weil die cancel Funktion nicht auf dem $parent Umfang, aber auf der übergeordneten Steuerung. Eine Möglichkeit, dies zu erreichen, ist wahrscheinlich unterschiedliche Namensgebung für Controller verwenden: related SO answer

  2. Andernfalls könnten Sie die cancel Funktion auf dem $scope Variable in createOrEditPropertyModal setzen.

Gerade createOrEditPropertyModal.js ändern:

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

zu

$scope.cancel = function() { 
    $uibModalInstance.close(); 
}; 
  1. Sie Funktionen modals ähnlich wie Richtlinien passieren kann: related SO answer
+0

Die zweite Lösung funktioniert möglicherweise nicht, weil http://stackoverflow.com/questions/23780181/angular-ui-modal-can-not-refer-to-parent-scope. Bitte lassen Sie mich wissen, und ich werde meine Antwort aktualisieren – fodma1

+0

Können Sie mir etwas mehr über die zweite Option erzählen? Kann ein einfaches Code-Snippet sein. – Sampath

+0

Ja, jetzt funktioniert es.Vielen Dank. Aber ich denke, das ist kein guter Weg, um Eltern/Kind-Referenz Nein zu behandeln? Was sind deine Gedanken? Wenn ich die verschiedenen Namen für die Controller ändere, dann denke ich, dass ich alle UI-Komponentennamen auch ändern muss, nein? Welche Methode ist Ihrer Meinung nach besser, wenn wir die Wartbarkeit usw. in Betracht ziehen? – Sampath

Verwandte Themen