当前位置: 首页 > 面试题库 >

AngularJS模态对话框中是否有处理“取消”的模式?

狄玉书
2023-03-14
问题内容

注意:这与显示AngularJS的模式对话框无关,该主题有很多问题和答案!

此问题是关于如何在页面上的模式对话框中对“确定”和“取消”做出反应。假设您有一个仅包含一个变量的范围:

$scope.description = "Oh, how I love porcupines..."

如果我在页面上为您提供了一个模式对话框,并在该对话框中使用ng-model =“
description”,则您所做的所有更改实际上都是在您键入内容时实时对说明本身进行的。不好,因为那您如何取消该对话框?

有一个问题说明我将在下面解释。可接受的答案是我想出的相同“解决方案”:AngularJS:数据绑定模式-
仅在单击“保存”时保存更改,或者在单击“取消”时忘记更改

如果单击按钮以调出模态,我将看到如何执行该操作,该操作返回到后面的函数,该函数为模态创建了相关数据的临时副本,然后弹出了模态。然后,“确定”(或“保存”或任何其他内容)可以将临时值复制到实际模型值。

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个模式进行一遍又一遍的工作吗?还是我疯了?


问题答案:

基本上,如果不是声明性的内容,则用角度表示,您就可以 编写指令

 .directive('shadow', function() {
  return {
    scope: {
      target: '=shadow'            
    },
    link: function(scope, el, att) {
      scope[att.shadow] = angular.copy(scope.target);

      scope.commit = function() {
        scope.target = scope[att.shadow];
      };
    }
  };

然后:

  <div shadow="data">
    <input ng-model="data">
    <button ng-click="commit()">save</button>
  </div>

因此datashadow指令内部将是原始指令的 副本data。单击该按钮后,它将被复制回原始文件。

这是工作示例:jsbin

我没有在此示例之外对其进行测试,因此它可能在其他情况下不起作用,但是我认为它给出了可能的想法。

编辑:

另一个示例,其中包含一个对象而不是一个字符串,并且具有多个字段形式(angular.copy此处需要一个附加字段):jsbin

Edit2,有角版本1.2.x

根据此更改,input内部指令不再访问隔离的作用域。一种替代方法是创建一个非隔离的子作用域(scope:true),以保存数据副本并访问父作用域以进行保存。

因此,对于较新的angular版本,此方法与之前进行修改的方法相同:

.directive('shadow', function() {
  return {
    scope: true,
    link: function(scope, el, att) {
      scope[att.shadow] = angular.copy(scope[att.shadow]);

      scope.commit = function() {
        scope.$parent[att.shadow] = angular.copy(scope[att.shadow]);
      };
    }
  };
});

示例:jsbin

请注意,使用的问题$parent是,如果中间最终有另一个作用域,它可能会中断。



 类似资料:
  • 本文向大家介绍详解AngularJS 模态对话框,包括了详解AngularJS 模态对话框的使用技巧和注意事项,需要的朋友参考一下 在涉及GUI程序开发的过程中,常常有模态对话框以及非模态对话框的概念 模态对话框:在子界面活动期间,父窗口是无法进行消息响应。独占用户输入 非模态对话框:各窗口之间不影响 主要区别:非模态对话框与APP共用消息循环,不会独占用户。 模态对话框独占用户输入,其他界面无法

  • 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是 Qt 所 独有的,在各种不同的平台下都存在。又有叫法是称为模式对话框,无模式对话框等。 所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进 行交互,直到该对话框关闭。对于非模 态对话框,当被打开时,用户既可选择和该对话框进 行交互,也可以选择同应用程序的其他窗口交互。 在 Qt

  • 问题内容: 简而言之:有什么方法可以创建非模式JFace对话框?我试图打电话无济于事。如果我没记错的话,这不是摇摆问题- 这是SWT的缺点,还是我只是在滥用小部件? TIA 问题答案: 使用 似乎是惯例。这对您不起作用吗?

  • 5.4.1 非模态对话框的特点 与模态对话框不同,非模态对话框不垄断用户的输入,用户打开非模态对话框后,仍然可以与其它界面进行交互。 非模态对话框的设计与模态对话框基本类似,也包括设计对话框模板和设计CDialog类的派生类两部分。但是,在对话框的创建和删除过程中,非模态对话框与模态对话框相比有下列不同之处: 非模态对话框的模板必须具有Visible风格,否则对话框将不可见,而模态对话框则无需设置

  • 本文向大家介绍BootStrap+Angularjs+NgDialog实现模式对话框,包括了BootStrap+Angularjs+NgDialog实现模式对话框的使用技巧和注意事项,需要的朋友参考一下 本篇文章主要介绍了"angularjs+bootstrap+ngDialog实现模式对话框",对于Javascript教程感兴趣的同学可以参考一下: 在完成一个后台管理系统时,需要用表显示注册用户

  • 问题内容: 我对AngularJS相当陌生,并且从模态对话框服务返回数据时遇到问题。基本上,我复制了Dan Wahlin的服务http://weblogs.asp.net/dwahlin/archive/2013/09/18/building-an- angularjs-modal- service.aspx, 并从我的控制器调用它。 然后我有我的部分,像这样: 这个模态被这样调用: 所以我的问题