【问题标题】:What is the best practice for opening a jquery dialog from angular?从角度打开 jquery 对话框的最佳做法是什么?
【发布时间】:2012-10-09 15:58:41
【问题描述】:

这是html:

<div ng-controller="MyCtrl">
    <a ng-click="open()">Open Dialog</a>
    <div id="modal-to-open" title="My Title" ui-jq="dialog" ui-options="{width: 350, autoOpen: false, modal: true}">
        Dialog Text
    </div>
</div>

这是 js:

function MyCtrl($scope) 
{
    $scope.open = function () {
        $('#modal-to-open').dialog('open');
    }
}

这是最好的方法吗?似乎有更好的方法可以在不访问 DOM 的情况下打开它,但我不确定我将如何去做。上面的代码有效,我只是想知道这是否是我应该这样做的方式。欢迎任何意见。

【问题讨论】:

  • 对于那些感兴趣的人,我刚刚完成了 Angular Bootstrap UI 对话服务的工作,我真的很喜欢它:angular-ui.github.io/bootstrap

标签: jquery-ui jquery-ui-dialog angularjs


【解决方案1】:

“最佳实践”在这里是模糊的。如果它是可读的并且有效,那么你就在那里,IMO,它可能很好。

也就是说,“角度方式”是将 DOM 操作排除在控制器之外,并使用依赖注入来确保一切都是可测试的。显然,您上面说明的方式很难测试,并且在控制器中放置了一些 DOM 操作。

我想我会做些什么来从控制器中获取 DOM 操作是使用指令:

一个简单的指令,用于将对话框打开调用与对元素的点击联系起来:

app.directive('openDialog', function(){
    return {
        restrict: 'A',
        link: function(scope, elem, attr, ctrl) {
            var dialogId = '#' + attr.openDialog;
            elem.bind('click', function(e) {
                $(dialogId).dialog('open');
            });
        }
    };
});

在标记中它会这样使用:

<button open-dialog="modal-to-open">Open Dialog</button>

现在,这显然是非常基本的。如果您愿意,您可以使用此功能获得相当先进的功能,为对话框中的不同选项添加其他属性。

你可以更进一步,添加一个为你打开对话框的服务,这样你就可以将它注入你的控制器甚至你的指令中,并以这种方式调用。例如:

app.factory('dialogService', [function() {
    return {
        open: function(elementId) {
            $(elementId).dialog('open');
        }
    };
}]);

在这里它正在使用中。这似乎很愚蠢,因为它本质上是一样的。但这主要是因为这是一个非常简单的例子。但它至少利用了 DI 并且是可测试的。

app.controller('MyCtrl', function($scope, dialogService) {
    $scope.open = function () {
        dialogService.open('#modal-to-open');
    };
});

无论如何。我希望所有这些都可以帮助您决定要走的路。有一千种方法可以做到这一点。 “正确”的方式是任何可行的方法,允许您做任何您需要做的事情(测试或其他任何事情),并且易于维护。

【讨论】:

  • 感谢您的详细解答。我想我会走服务路线。我喜欢。好建议!
  • @ben-lesh,dialogService 工厂中缺少“]”。
猜你喜欢
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多