与没有动态内容的对话框相比,创建具有动态内容的模式对话框的最佳实践是什么。
例如..我们有一些接受表单元素列表的模态表单,并具有提交/取消。此外,还有一些模态对话框仅显示确认/确定类型的操作。
我看到很多人说对话框应该是传递给控制器的服务,但在我看来,服务不应该呈现 UI 组件和操纵 DOM。
组装这两种类型的对话框的最佳做法是什么?谢谢。
与没有动态内容的对话框相比,创建具有动态内容的模式对话框的最佳实践是什么。
例如..我们有一些接受表单元素列表的模态表单,并具有提交/取消。此外,还有一些模态对话框仅显示确认/确定类型的操作。
我看到很多人说对话框应该是传递给控制器的服务,但在我看来,服务不应该呈现 UI 组件和操纵 DOM。
组装这两种类型的对话框的最佳做法是什么?谢谢。
Angular UI Boostrap 提供了一个服务——$dialog
可以在任何你需要使用对话框的地方注入。该服务有两种主要方法:dialog
和messageBox
. 前者用于创建具有动态内容的对话框,后者用于创建带有标题、消息和一组按钮的消息框。两者都返回一个承诺,以便您可以在它可用时处理它的结果。
我认为这种方法效果很好,因为它符合某种自然的、命令式的对话处理方式。例如,如果用户单击一个按钮,并且您想显示一个对话框然后处理其结果,则代码可能如下所示:
$scope.doSomething = function() {
$dialog.dialog().open().then(function(result) {
if (result === OK) {
// Process OK
}
else {
// Process anything else
}
});
}
您确实可以使用指令来做同样的事情,也许这似乎是正确的方法,因为涉及到 DOM 操作,但我认为处理它会有点尴尬。前面的例子是这样的:
<dialog visible="dialogVisible" callback="dialogCallback()"></dialog>
...
$scope.doSomething = function() {
$scope.dialogVisible = true;
}
$scope.dialogCallback = function(result) {
if (result === OK) {
// Process OK
}
else {
// Process anything else
}
}
IMO,第一个例子看起来更好,更容易理解。
由于对话框是 DOM 组件,它们可能应该是指令。您可以在指令本身内部构建模态的 DOM 元素,也可以将主 html 页面上的元素隐藏并从指令中取消隐藏它们。如果您不隔离指令的范围,则可以只从指令中引用控制器范围(除非您在子范围中)。
动态与静态内容并不是 IMO 的决定点。由于您可以从指令中访问范围,因此您可以从继承的范围中访问您需要的任何内容。
一种运行良好的非常简单的设计是:
改进如下: