【发布时间】:2013-05-26 03:29:23
【问题描述】:
注意:这不是关于使用 AngularJS 显示模态对话框,该主题有很多问题和答案!
这个问题是关于如何在页面上的模式对话框中对 OK 和 Cancel 做出反应。假设你有一个只有一个变量的作用域:
$scope.description = "Oh, how I love porcupines..."
如果我在页面上为您提供一个模式对话框并在该对话框中使用 ng-model="description",那么您所做的所有更改实际上都是在您键入时对描述本身实时进行的。这很糟糕,因为那你如何取消该对话框?
有这个问题说按照我在下面解释的去做。公认的答案与我想出的“解决方案”相同:AngularJS: Data-bound modal - save changes only when "Save" is clicked, or forget changes if "Cancel" is clicked
如果单击按钮以调出模态框返回到后面的函数并为模态框创建相关数据的临时副本然后弹出模态框,我可以看到该怎么做。然后“确定”(或“保存”或其他)可以将临时值复制到实际模型值。
main.js(摘录):
$scope.descriptionUncommitted = $scope.description;
$scope.commitChanges = function () {
$scope.description = $scope.descriptionUncommitted;
}
main.html(摘录):
<input type="text" ng-model="descriptionUncommitted"/>
<button ng-click="commitChanges()">Save</button>
问题在于 它不是声明性的!事实上,它在其他任何地方都不像 AngularJS。就好像我们需要一个 ng-model-uncommitted="description" ,他们可以在其中进行他们想要的所有更改,但只有在我们触发另一个声明时它们才会被提交。插件中是否有这样的东西,还是 AngularJS 本身添加了它?
编辑:似乎可以举一个不同方式的例子。
main.js:
$scope.filename = "panorama.jpg";
$scope.description = "A panorama of the mountains.";
$scope.persist = function () { // Some function to hit a back end service. };
main.html:
<form>
<input type="text" ng-model-uncommitted="filename"/>
<input type="text" ng-model-uncommitted="description"/>
<button ng-commit ng-click="persist()">Save</button>
<button ng-discard>Cancel</button>
</form>
我在它周围贴了一个表单标签,因为我不知道你会如何对这些项目进行分组,所以很明显它都是同一个“交易”的一部分(因为没有更好的词)。但是需要某种方式使这一切都可以自动发生,并且模型变量的克隆副本用于初始值,用于输入并自动更新,验证等,然后最终丢弃或复制到相同的值如果用户决定提交,最初用于创建它们。
这样的事情不是比控制器中的代码更容易为大型网站中的 20 个模式一遍又一遍地完成这项工作吗?还是我疯了?
【问题讨论】:
-
您是否正在寻找一个取消按钮,该按钮会自动恢复对模态模型所做的更改?单击取消按钮时如何刷新模型,以便在不需要额外临时变量的情况下覆盖模型?你能提供一个你正在寻找的语法/标记的例子吗?
-
您不能允许更改发生,因为用户可能会在页面上看到 {{description}} 的实例在他们键入时更新(或在号等)。我将在上面添加一些想法,以提供我希望看到的内容。我只是希望某些东西已经存在。
-
你绝对不是疯子。我不清楚描述和altDescription。它们是两个独立的模型,而不是您的备份版本吗?在您的示例中,这些字段会显示什么?已编辑或未编辑的数据?
-
再考虑一下,我很确定你可以在指令中完成你想要的。
-
我试图更清楚地表明这些值是不相关的,我只是想表明即使有多个模型值,这也应该有效。我希望您会调出该页面,并且您会看到输入中填充了文件名和描述的当前值。编辑它们后,如果用户点击“保存”,这些更改将被推送到模型变量中,就像您对每个变量都使用了 ng-model 一样,如果需要,ng-click 可以触发一些东西将其推送到后端服务.如果用户点击取消,那么这些更改将被丢弃,并且模型值永远不会改变。
标签: javascript angularjs