如何使用指令在控制器之间传递数据?

时间:2016-05-30 00:04:53

标签: angularjs controller directive

我有一个名为ClaimController的控制器,用于存储各种对象,例如PatientPrescriber等。为了简单起见并且能够重用,我创建了另一个控制器PatientController,并为我需要的每个组件创建了类似的其他控制器。因此,如上所述,ClaimController的片段如下所示。

testApp.controller('ClaimController', [
   '$scope', ..., 
   function($scope, ...){
       var vm = this;
       vm.Patient = {}
       .....
}]);

然后PatientController看起来像这样:

testApp.controller('PatientController', [
    '$scope', ... , 
    function ($scope, .. ){
          var vm = this; 
          vm.Patient = {};
          ....         
}]);

我在PatientControllerClaimController中拥有对象vm.Patient的原因是我可以在其他地方使用PatientController并且还可以为给定的患者关联声明。

因此,PatientController存储Patient对象(或对其进行的任何更改)。然后,当ClaimController上单击“保存”按钮时,vm.Patient对象应具有来自vm.Patient的{​​{1}}对象。为此,我甚至创建了一个指令:

PatientController

模板:

testApp.directive('patientInfo', function(){
      return {
           restrict: 'A',
           transclude: false,
           templateUrl: 'path/to/template', 
           controller: 'PatientController',
           controllerAs: 'patCtrl',
           scope: {
               patient: '='
           },

           link: function(scope, element, attrs){


           }
      }
}

但是,即使<div ng-controller="ClaimController as ctrl"> <div patient-info patient="ctrl.Patient"></div> </div> 中的vm.Patient包含数据,ClaimController对象中的vm.Patient始终为空,这对我不起作用。所以数据没有通过。我怎样才能解决这个问题?

2 个答案:

答案 0 :(得分:0)

因此,我最终为我正在观看的数组或对象而不是每个字段创建$watchCollection,并将数据保存在共享服务中以供稍后其他组件使用。我删除了该指令并将$watchCollection放在PatientController中,使其保持简单。

$scope.$watchCollection('patCtrl.Patient', function(newVal, oldVal){
          SharedService.setPatient(newVal);
});

模板现在不依赖于ClaimController。由于所有组件都有SharedService,因此当用户点击ClaimController按钮时,save可以检索数据。

答案 1 :(得分:-1)

您的代码几乎是正确的,只是代码中的一个错误。您需要使用数据方法而不是“患者信息患者”

<div ng-controller="ClaimController as ctrl">
<div data-method="ctrl.Patient"></div>
</div>