Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS指令作用域未更新 出身背景_Javascript_Angularjs - Fatal编程技术网

Javascript AngularJS指令作用域未更新 出身背景

Javascript AngularJS指令作用域未更新 出身背景,javascript,angularjs,Javascript,Angularjs,我已经创建了一个指令来跟踪表上的选择。该指令与ng repeat一起工作,并向ng repeat创建的每个元素添加一个单击事件,当用户单击元素时,该指令更新记录选择项atribute,并将该项设置为控制器作用域上的选择项,以供以后使用 问题 “my directive click”事件未更新父作用域CampaignDetailCtrl,“选择”属性从未更改,“始终为空”。我知道使用scope:false会导致指令使用父范围,但似乎没有按计划工作 问题 如何根据指令在我的ActivityDetai

我已经创建了一个指令来跟踪表上的选择。该指令与ng repeat一起工作,并向ng repeat创建的每个元素添加一个单击事件,当用户单击元素时,该指令更新记录选择项atribute,并将该项设置为控制器作用域上的选择项,以供以后使用

问题 “my directive click”事件未更新父作用域CampaignDetailCtrl,“选择”属性从未更改,“始终为空”。我知道使用scope:false会导致指令使用父范围,但似乎没有按计划工作

问题 如何根据指令在我的ActivityDetailCtrl上设置$scope.selection的值

控制器 }]

指示 })

HTML 实例
请参阅简单的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