javascript - Angularjs:当在ngRepeat中传入属性时如何在不使用隔离范围的情况下更新指令中的父范围

标签 javascript angularjs angularjs-directive angularjs-scope angularjs-ng-repeat

我有一个简单的 angularjs 指令,它使用 JQuery 将模板转换为可拖动的对话框

var myApp = angular.module("myApp", []);
myApp.controller('myCtrl', function ($scope) {
    $scope.tasks = [{
        name: 'learn angular',
        show: false
    }, {
        name: 'build an angular app',
        show: false
    }];
    $scope.showBox = function (taskname) {
        for (var i = 0; i < $scope.tasks.length; i++) {
            if ($scope.tasks[i].name === taskname) {
                $scope.tasks[i].show = !$scope.tasks[i].show;
            }
        }
    }
});
myApp.directive("draggableDialog", function () {
    return {
        template: 'task: {{task.name}}',
        link: function (scope, element, attrs) {
            element.dialog({
                title : "My Dialog",
                autoOpen: false
            });
            element.bind("dialogclose", function () {
                if (!scope.$$phase) {
                    scope.$apply(function () {
                        scope[attrs.draggableDialog] = false; //here is the problem
                    });
                }
            });
            scope.$watch(attrs.draggableDialog, function (v) {
                if (v) {
                    element.dialog("open");
                } else {
                    element.dialog("close");
                }

            });
        }
    }
});

我在 ngRepeat 中使用这个指令

<div>
     <h2>Draggable Dialog</h2>
    <div ng-controller="myCtrl">
        <ul class="unstyled">
            <li ng-repeat="task in tasks">
                <button ng-click="showBox(task.name)">show {{task.name}}</button>{{task.show}}
                <div draggable-dialog="task.show">test</div>
            </li>
        </ul>
    </div>
</div>

引用这个 fiddle :http://jsfiddle.net/tianhai/BEtPk/#base

当用户手动关闭对话框时,我可以检测到该事件,我想将 myCtrl 中的 $scope.task[i].show 设置为 false。我该怎么做?我无法使用隔离作用域双向绑定(bind),因为我将此指令与另一个也接受 $scope.task 的指令一起使用。

最佳答案

您将 attrs.draggableDialog 设置为“task.show”,所以当您这样做时 scope[attrs.draggableDialog] = false 你最终得到一个附加到范围的元素,你可以使用 scope['task.show'] 访问它,这与 scope['task']['show']scope.task.show

要将父变量一般设置为 false,您需要评估包含赋值的字符串。对你来说它看起来像这样:

scope.$eval(attrs.draggableDialog + ' = false;');

希望对您有所帮助

关于javascript - Angularjs:当在ngRepeat中传入属性时如何在不使用隔离范围的情况下更新指令中的父范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22033421/

相关文章:

java - 正则表达式如何将字符串的一部分替换为另一个字符串

javascript - 装饰 Angulars $ExceptionHandler 时如何防止令人讨厌的副作用?

javascript - 如何将指令作用域值传递给同一指令模板中调用的全局 JavaScript 函数?

javascript - 没有模板的 AngularJS 指令并共享父范围的更新

javascript - 来自 Cloud Function 的未处理拒绝,但它有时会运行

javascript - 将查询字符串添加到 data-href

javascript - $window 错误 '$window not defined' Angular 应用程序中的谷歌分析代码

javascript - 使用 jquery 将类添加到 ng-repeat 中的第一个项目

javascript - Angularjs - 元素上的多个指令,其中一个是隔离范围

javascript - 两个javascript对象数组的区别