2017-02-23 38 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; 
} 
相关问题