gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:36:04 30 4
gpt4 key购买 nike

我有一个简单的 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com