javascript - angularjs selft $broadcast 和 $on

标签 javascript angularjs angularjs-directive ionic-framework

我创建了类似于下拉菜单的自定义指令,但在我的情况下,项目在模式弹出窗口中打开,选择后项目将在 div 中选择。

现在我添加了两个指令(即同一指令的两个实例)并使用这两个指令作为父子方式工作。我从rest api获取项目,然后分配给第一个指令(即父级),并根据第一个指令的选择,我正在过滤另一个rest api,然后分配给第二个指令(即子级) >)效果非常好。但我想每当更改第一个指令的选择时重置第二个指令的值(所选项目)。

我将以下代码添加到我的指令中,但它对我没有帮助

controller: ['$scope', '$rootScope',
        function($scope, $rootScope) {
          $scope.$watch('value', function(val) {
            $rootScope.$broadcast('valueChanged', $scope.id);
          });
          $scope.psChanged = function() {
            $scope.$on('valueChanged', function(event, value) {
              if (value === $scope.id) {
                //Do nothing.
              } else {
                console.log("Text change");
              }
            });
          }
        }
      ]

我的完整工作插件 http://plnkr.co/edit/f6LYS2aGrTXGkZ3vrIDD?p=preview

有人可以帮我完成它吗?

最佳答案

当我正在监听事件 valueChanged 时,我在隔离范围中添加了一个名为 isChild 的属性。所以我在没有函数 psChanged 的​​情况下在 Controller 中绑定(bind)了监听器,并且它可以工作。

angular.module('plexusSelect', []).directive('plexusSelect', ['$ionicModal', '$timeout', '$ionicScrollDelegate', '$rootScope',
  function($ionicModal, $timeout, $ionicScrollDelegate, $rootScope) {
    // Runs during compile
    return {
      scope: {
        'items': '=',
        'id': '@',
        'text': '@',
        'textIcon': '@',
        'headerText': '@',
        'textField': '=',
        'valueField': '@',
        'callback': '&',
        'isChild' : '@'
      },
      require: 'ngModel',
      restrict: 'E',
      templateUrl: 'plexusSelect.html',
      controller: ['$scope', '$rootScope',
        function($scope, $rootScope) {
          $scope.$watch('value', function(val) {
            $rootScope.$broadcast('valueChanged', $scope.id);
          });
          if ($scope.isChild === 'true') {
          //$scope.psChanged = function() {
            $scope.$on('valueChanged', function(event, value) {
              if ($scope.id === value) {
                //Do nothing.
              } else {
                $scope.clearSearch();
                $scope.value = '';
                $scope.text = $scope.defaultText;
                console.log("Text change");
              }
            });

          }
        }
      ],

html

<ion-view view-title="Search" ng-controller='SearchCtrl'>
    <ion-content>
    <h1>Search</h1>
  <plexus-select id="psDeparture"  is-child='false' items="deptStations" header-text="Select Departure Station" text="Select departure..." text-icon="icon-takeoff" text-field="['City_Name_EN','City_Code']" value-field="City_Code" ng-model="deptStation.value"></plexus-select>
    <plexus-select id="psArrival" is-child='true' items="arrStations" header-text="Select Arrival Station" text="Select arrival..." text-icon="icon-landing" text-field="['Destination.City_Name_EN','Destination.City_Code']" value-field="Destination.City_Code" ng-model="arrStation.value"></plexus-select>
    </ion-content>
</ion-view>

plunk

关于javascript - angularjs selft $broadcast 和 $on,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28165229/

相关文章:

javascript - react 中列表未更新

javascript - ng-src 中的函数执行多次

jquery - 在 Angular 中手动编译指令时出现内存泄漏

angularjs - 更新 : Responsive images in AngularJS

javascript - angular.js 指令 templateUrl 无法绑定(bind)范围

javascript - Javascript 中的复杂字符串解析

javascript - 通过 JS 插入时,具有内联 block 和文本对齐的 DOM 等距 div 将不起作用

javascript - 如何从不包含搜索关键字的字符串数组中删除字符串?

javascript - Angular : having a function as ng-false-value

angularjs - $http 在 angularjs 中响应为 304(未修改)时返回错误