2017-02-23 55 views
0

開始:我沒有錯誤,但嘗試優化我的代碼。Angular - 在指令中使用控制器功能

我有一個應用程序,在很多情況下,地址會顯示。這個地址在許多情況下應該是可編輯的。所以我創建了一個指令。

我的指令

app.directive('addressview', function(medipracticeData) { 
    return { 
     restrict: 'E', 
     templateUrl: 'address-view.html', 
     replace : true, 
     scope : { 
      address : '=', 
      editAddress : '&?' 
     }, 
     controller : function($scope){ 
      $scope.edit = function(){ 
       $scope.editAddress({ address : $scope.address }); 
      } 
     } 
    }; 
}); 

我的指令模板(地址view.html)

<div ng-controller="AddressController as AddressCtrl"> 
    <addressview 
     address="OfficeCtrl.office.address" 
     edit-address="AddressCtrl.showAddressEdit(address)"> 
    </addressview> 
</div> 

正如你所看到的,我經過AddressCtrl.showAddressEdit()功能在每一個指令.. 。這是我的地址控制器中的功能,它觸發一個彈出窗口,我可以在其中編輯地址。

我控制器

app.controller("AddressController", AddressController); 

AddressController.$inject = ["$scope"]; 

function AddressController($scope) { 

    var avm = this; 
     avm.showAddressEdit = showAddressEdit; 

    function showAddressEdit(address) { 
     console.log(address); 
    } 
} 

我的問題

我試圖避免將這個功能AddressCtrl.showAddressEdit()我的指令,所有的時間。是否可以在我的指令控制器中使用此功能?這樣每次我使用這個指令,它會使用如下:

<div ng-controller="AddressController as AddressCtrl"> 
    <addressview 
     address="OfficeCtrl.office.address"> 
    </addressview> 
</div> 
+0

無關你的問題,但兩件事情: 你正在使用'取代:TRUE'屬性,它被廢棄了。不要再使用它了。你在哪個角度版本? 此外,你可以使用組件而不是指令,檢查出來:[組件](https://docs.angularjs.org/guide/component) –

+0

另外,請[不要在你的html中使用ng-controller ](https://teropa.info/blog/2014/10/24/how-ive-improved-my-angular-apps-by-banning-ng-controller.html),不要使用範圍,而是如果您想改進您的代碼,請使用'controllerAs'語法 –

回答

1

你可以使用一個服務,這樣

angular.module("myModule").service("myService", function(){ 
    return { 
     showAddressEdit: function(address) { 
      console.log(address); 
     } 
    }; 
}); 

然後,您可以在指令它注入到控制器/組件是這樣的:

// ... 
controller : function($scope, myService){ 
     $scope.edit = function(){ 
      $scope.editAddress({ address : $scope.address }); 
     } 

     $scope.showAdressEdit = myService.showAdressEdit; 
} 
相關問題