Jquery 将数据从指令传递到同级DOM的正确方法是什么?

Jquery 将数据从指令传递到同级DOM的正确方法是什么?,jquery,angularjs,Jquery,Angularjs,出于动画的原因,我在不同的HTML元素中分离了指令及其值 当指令加载到那里时,分离的元素需要从指令中更新。如何使用相同的控制器将信息从指令传递到其他HTML元素 例如: <div class="progName"> <program-name app-name="appName" index='{{$index}}' ng-repeat="appName in appNames"></program-name> <!-- the fir

出于动画的原因,我在不同的HTML元素中分离了指令及其值

当指令加载到那里时,分离的元素需要从指令中更新。如何使用相同的
控制器
将信息从
指令
传递到其他HTML元素

例如:

<div class="progName">
    <program-name app-name="appName" index='{{$index}}' ng-repeat="appName in appNames"></program-name> 
    <!-- the first directive as active one then.. -->
</div>

<div>Some other details goes here</div>
<div class="percent">
    {{appName.percent}}
    <!-- how to pass here -->
</div> 
<div>
    some footer information
</div>

这里还有其他一些细节
{{appName.percent}
一些页脚信息
在我的场景中,每当用户单击指令时,
{{{appName.percent}}
需要从指令中更新

如果我不清楚,请评论


假设您希望在DOM树中同级的两个指令(传递数据)之间通信

当两个指令不在DOM树的父子关系中,并且需要在它们之间进行通信时,可以使用$rootScope。并从$rootScope广播一个事件,并在另一个指令中接收该事件

只需在一个指令(您希望从中发送数据)中注入$rootScope并使用

$rootScope.$broadcast("eventName",attrs.valueYouWantToPass);
然后在另一个指令上(您希望在该指令上接收传递的数据),您必须处理此事件。只需使用以下代码段:

scope.$on('eventName', function (event, valueThatPassed) {
   //use this valueThatPassed to do what you want to do
   event.stopPropagation(); //stop the propagation so that the event doesn't propagate further
});
检查完你的小提琴后。我简化了它。我已经删除了其他不需要的代码来显示“解决您的确切问题”。我刚刚将其更改为一个新的fiddle,其中它使用该指令的appName.percent value on click事件更改指令元素的值。请检查下面的小提琴


假设您希望在DOM树中同级的两个指令(传递数据)之间通信

当两个指令不在DOM树的父子关系中,并且需要在它们之间进行通信时,可以使用$rootScope。并从$rootScope广播一个事件,并在另一个指令中接收该事件

只需在一个指令(您希望从中发送数据)中注入$rootScope并使用

$rootScope.$broadcast("eventName",attrs.valueYouWantToPass);
然后在另一个指令上(您希望在该指令上接收传递的数据),您必须处理此事件。只需使用以下代码段:

scope.$on('eventName', function (event, valueThatPassed) {
   //use this valueThatPassed to do what you want to do
   event.stopPropagation(); //stop the propagation so that the event doesn't propagate further
});
检查完你的小提琴后。我简化了它。我已经删除了其他不需要的代码来显示“解决您的确切问题”。我刚刚将其更改为一个新的fiddle,其中它使用该指令的appName.percent value on click事件更改指令元素的值。请检查下面的小提琴


假设您希望在DOM树中同级的两个指令(传递数据)之间通信

当两个指令不在DOM树的父子关系中,并且需要在它们之间进行通信时,可以使用$rootScope。并从$rootScope广播一个事件,并在另一个指令中接收该事件

只需在一个指令(您希望从中发送数据)中注入$rootScope并使用

$rootScope.$broadcast("eventName",attrs.valueYouWantToPass);
然后在另一个指令上(您希望在该指令上接收传递的数据),您必须处理此事件。只需使用以下代码段:

scope.$on('eventName', function (event, valueThatPassed) {
   //use this valueThatPassed to do what you want to do
   event.stopPropagation(); //stop the propagation so that the event doesn't propagate further
});
检查完你的小提琴后。我简化了它。我已经删除了其他不需要的代码来显示“解决您的确切问题”。我刚刚将其更改为一个新的fiddle,其中它使用该指令的appName.percent value on click事件更改指令元素的值。请检查下面的小提琴


假设您希望在DOM树中同级的两个指令(传递数据)之间通信

当两个指令不在DOM树的父子关系中,并且需要在它们之间进行通信时,可以使用$rootScope。并从$rootScope广播一个事件,并在另一个指令中接收该事件

只需在一个指令(您希望从中发送数据)中注入$rootScope并使用

$rootScope.$broadcast("eventName",attrs.valueYouWantToPass);
然后在另一个指令上(您希望在该指令上接收传递的数据),您必须处理此事件。只需使用以下代码段:

scope.$on('eventName', function (event, valueThatPassed) {
   //use this valueThatPassed to do what you want to do
   event.stopPropagation(); //stop the propagation so that the event doesn't propagate further
});
检查完你的小提琴后。我简化了它。我已经删除了其他不需要的代码来显示“解决您的确切问题”。我刚刚将其更改为一个新的fiddle,其中它使用该指令的appName.percent value on click事件更改指令元素的值。请检查下面的小提琴


如果需要绑定控制器的百分比,请向其添加双向数据绑定,以便每个指令都可以直接访问它:

.directive('programName', function ($compile) {
return {
    restrict: 'AE',
    replace: true,
    scope: {
        appName: '=',
        index: '@',
        percent: '='
    },
    link: function (scope, element, attr) {
        var getTemplate = function (index) {
            return Number(index) ? '<h2 class="que t{{index}}" ng-click=callMe()>{{appName.name}} {{appName.company}}{{appName.percent}}</h2>' : '<h2 class="active que t{{index}}" ng-click=callMe()>{{appName.name}}arif {{appName.company}}{{appName.percent}}</h2>';
        }
        element.html(getTemplate(scope.index));
        $compile(element.contents())(scope);
    },
    controller: function ($scope) {
        $scope.callMe = function () {
            $scope.percent = $scope.appName.percent;
        }
    }
}
我强烈反对使用
$rootScope
,因为双向通信避免了所有这些消息处理及其引入的耦合


如果需要绑定控制器的百分比,请向其添加双向数据绑定,以便每个指令都可以直接访问它:

.directive('programName', function ($compile) {
return {
    restrict: 'AE',
    replace: true,
    scope: {
        appName: '=',
        index: '@',
        percent: '='
    },
    link: function (scope, element, attr) {
        var getTemplate = function (index) {
            return Number(index) ? '<h2 class="que t{{index}}" ng-click=callMe()>{{appName.name}} {{appName.company}}{{appName.percent}}</h2>' : '<h2 class="active que t{{index}}" ng-click=callMe()>{{appName.name}}arif {{appName.company}}{{appName.percent}}</h2>';
        }
        element.html(getTemplate(scope.index));
        $compile(element.contents())(scope);
    },
    controller: function ($scope) {
        $scope.callMe = function () {
            $scope.percent = $scope.appName.percent;
        }
    }
}
我强烈反对使用
$rootScope
,因为双向通信避免了所有这些消息处理及其引入的耦合


如果需要绑定控制器的百分比,请向其添加双向数据绑定,以便每个指令都可以直接访问它:

.directive('programName', function ($compile) {
return {
    restrict: 'AE',
    replace: true,
    scope: {
        appName: '=',
        index: '@',
        percent: '='
    },
    link: function (scope, element, attr) {
        var getTemplate = function (index) {
            return Number(index) ? '<h2 class="que t{{index}}" ng-click=callMe()>{{appName.name}} {{appName.company}}{{appName.percent}}</h2>' : '<h2 class="active que t{{index}}" ng-click=callMe()>{{appName.name}}arif {{appName.company}}{{appName.percent}}</h2>';
        }
        element.html(getTemplate(scope.index));
        $compile(element.contents())(scope);
    },
    controller: function ($scope) {
        $scope.callMe = function () {
            $scope.percent = $scope.appName.percent;
        }
    }
}
我强烈反对使用
$rootScope
,因为双向通信避免了所有这些消息处理及其引入的耦合


如果需要绑定控制器的百分比,请向其添加双向数据绑定,以便每个指令都可以直接访问它:

.directive('programName', function ($compile) {
return {
    restrict: 'AE',
    replace: true,
    scope: {
        appName: '=',
        index: '@',
        percent: '='
    },
    link: function (scope, element, attr) {
        var getTemplate = function (index) {
            return Number(index) ? '<h2 class="que t{{index}}" ng-click=callMe()>{{appName.name}} {{appName.company}}{{appName.percent}}</h2>' : '<h2 class="active que t{{index}}" ng-click=callMe()>{{appName.name}}arif {{appName.company}}{{appName.percent}}</h2>';
        }
        element.html(getTemplate(scope.index));
        $compile(element.contents())(scope);
    },
    controller: function ($scope) {
        $scope.callMe = function () {
            $scope.percent = $scope.appName.percent;
        }
    }
}
我强烈反对使用
$rootScope
,因为双向通信避免了所有这些消息处理及其引入的耦合


创建一个用于保存数据的服务,并在两个指令上都需要该服务。然后您可以随时访问数据,而无需传递数据。服务可以在需要时通知指令

app.service('shareData', function () {
  var UPDATE_EVENT = 'update',
  var REMOVE_EVENT = 'remove', 
  var listeners = {};
  var data = {};
  return {
    on: function (eventName, callback) {
      if (listeners.hasOwnProperty(eventName)) {
        listeners[eventName].push(callback);
      } else {
       listeners[eventName] = [callback];
      }
    },
    set: function () {
      if (arguments.length > 1) {
        data[arguments[0]] = arguments[1];
        notify(UPDATE_EVENT + '.' + arguments[0]);
      }

      if (arguments.length === 1) {
        data = arguments[0];
        notify(UPDATE_EVENT);
      }

      if (arguments.length < 1) {
        throw new Error('set method requires at least one parameter');
      }
    }
  };

  function notify (eventName) {
    if (!listeners.hasOwnProperty(eventName)) {
      throw new Error('No such event registered' + eventName );
    }

    for (var i = 0; i < listeners[eventName]; i++) {
     listeners[eventName][i]();
    } 
  } 

})
.directive('firstDirective'['shareData', function (shareData){
  return {
   link: function (scope, element, attrs, ctrl) {
     shareData.on('update', function () {
       // Do your stuff
     });
   }
  };

}])
.directive('secondDirective'['shareData', function (shareData){
  return {
   link: function (scope, element, attrs, ctrl) {
     element.bind('click', fucntion () {
       shareData.set({
         // change your data
       });
     });

   }
  };

}]);
app.service('shareData',函数(){
var UPDATE_事件='UPDATE',
var REMOVE_事件='REMOVE',
var侦听器={};
变量数据={};
返回{
on:函数(eventName,回调){
如果(听众)。