Javascript AngularJS指令作用域未更新 出身背景
我已经创建了一个指令来跟踪表上的选择。该指令与ng repeat一起工作,并向ng repeat创建的每个元素添加一个单击事件,当用户单击元素时,该指令更新记录选择项atribute,并将该项设置为控制器作用域上的选择项,以供以后使用 问题 “my directive click”事件未更新父作用域CampaignDetailCtrl,“选择”属性从未更改,“始终为空”。我知道使用scope:false会导致指令使用父范围,但似乎没有按计划工作 问题 如何根据指令在我的ActivityDetailCtrl上设置$scope.selection的值 控制器 }] 指示 }) HTML 实例Javascript AngularJS指令作用域未更新 出身背景,javascript,angularjs,Javascript,Angularjs,我已经创建了一个指令来跟踪表上的选择。该指令与ng repeat一起工作,并向ng repeat创建的每个元素添加一个单击事件,当用户单击元素时,该指令更新记录选择项atribute,并将该项设置为控制器作用域上的选择项,以供以后使用 问题 “my directive click”事件未更新父作用域CampaignDetailCtrl,“选择”属性从未更改,“始终为空”。我知道使用scope:false会导致指令使用父范围,但似乎没有按计划工作 问题 如何根据指令在我的ActivityDetai
请参阅简单的jsBin示例:您有阴影问题。您可以在不同的地方阅读更多关于它的内容,但请记住,ng repeat会为每个项目创建一个新的子范围 要避免范围阴影,请使用。在您的模型中:
$scope.selection = {
noShadow: null
};
// later: $scope.selection.noShadow
此处的工作示例:
虽然这将很好地工作,但最好在您的选择中有独立的作用域,并将它们包装到选定的指令中。然后,所选指令将被其他指令“要求”,它们之间的通信将由所选指令上定义的控制器管理。您可以在此处阅读有关“通信”指令的更多信息:
请参见require属性
如果需要帮助,请告诉我。请设置演示。Thx请将您的代码添加到plunker/fiddle中,以便人们可以使用它。在jsBin上创建了一个工作示例。谢谢,阴影是一个令人困惑的问题,在我理解这个问题之前,我必须阅读一些链接的文章。这让我重新审视了我构建应用程序部分的方式。
app.directive('selection', function () {
var directive = {
restrict: 'A',
scope: false,
link: function (scope, element, attrs) {
var selected_class = 'selected';
var repeat_line = attrs.ngRepeat;
if (!repeat_line) {
throw 'selection must be used along side ngRepeat';
}
var repeat_parts = repeat_line.split(' in ');
var selected_item = scope.$eval(repeat_parts[0]);
scope.$watch(scope.selection, function(newVal, oldVal) {
});
/**
* Item click handler
*/
var handleClick = function (event) {
selected_item.selected = !selected_item.selected;
scope.selection = selected_item;
if(selected_item.selected) {
element.addClass(selected_class);
} else {
element.removeClass(selected_class);
}
};
element.on('click', handleClick);
}
};
return directive;
<div ng-controller="CampaignDetailCtrl">
...
<table>
<thead>
<tr>
<th>...</th>
</tr>
</thead>
<tbody>
<tr selection ng-repeat="channel in record.channels" ng-dblclick="edit(channel)">
<td>{{...}}</td>
</tr>
</tbody>
</table>
...
$scope.selection = {
noShadow: null
};
// later: $scope.selection.noShadow