2017-02-23 9 views
0

開始するにはエラーは発生していませんが、コードを最適化しようとしています。角度 - 指令のコントローラー機能を使用

多くの場合、住所が表示されるアプリケーションがあります。このアドレスは多くの場合編集可能でなければなりません。そこで私は指令を作成しました。

マイディレクティブ

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

が、2つのこと: あなたは '置き換える使用している:廃止されましたtrue'の属性を、このようなコンポーネント。もう使用しないでください。どの角度バージョンをお使いですか? また、ディレクティブの代わりにコンポーネントを使用することもできます。[components](https://docs.angularjs.org/guide/component) –

+0

また、[ng-controllerをHTMLで使用しないでください](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; 
} 
関連する問題