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

时间:2014-02-26 06:21:52

标签: 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>

请参阅此小提琴:http://jsfiddle.net/tianhai/BEtPk/#base

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

1 个答案:

答案 0 :(得分:2)

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

不同的scope.task.show来访问该元素

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

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

希望这有帮助