Jquery 将数据从指令传递到同级DOM的正确方法是什么?
出于动画的原因,我在不同的HTML元素中分离了指令及其值 当指令加载到那里时,分离的元素需要从指令中更新。如何使用相同的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元素
例如:
<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,回调){
如果(听众)。