触发自定义验证指令后,AngularJS ng-model 值丢失

2024-03-09

我创建了一个自定义验证指令并在表单中使用它。可以正常触发,但是触发验证后,发现model值就丢了。说我有

ng-model="project.key" 

并在验证后,project.key范围内不再存在。我认为我对 AngularJS 的理解是错误的并且做了一些错误的事情。

代码会说话。

这是我的 html 页面:

 <div class="container">
    ...
    <div class="form-group"
            ng-class="{'has-error': form.key.$invalid && form.key.$dirty}">
            <label for="key" class="col-sm-2 control-label">Key</label>
            <div class="col-sm-10">
                <input type="text" class="form-control text-uppercase" name="key"
                    ng-model="project.key" ng-model-options="{ debounce: 700 }"
                    placeholder="unique key used in url"
                    my-uniquekey="vcs.stream.isProjectKeyValid" required />
                <div ng-messages="form.key.$error" ng-if="form.key.$dirty"
                    class="help-block">
                    <div ng-message="required">Project key is required.</div>
                    <div ng-message="loading">Checking if key is valid...</div>
                    <div ng-message="keyTaken">Project key already in use, please
                        use another one.</div>
                </div>
            </div>
        </div>
    <div class="col-sm-offset-5 col-sm-10">
        <br> <a href="#/" class="btn">Cancel</a>
        <button ng-click="save()" ng-disabled="form.$invalid"
            class="btn btn-primary">Save</button>
        <button ng-click="destroy()" ng-show="project.$key"
            class="btn btn-danger">Delete</button>
    </div>
</form>

这是我的指令:

    .directive('myUniquekey', function($http) {
        return {
            restrict : 'A',
            require : 'ngModel',
            link : function(scope, elem, attrs, ctrl) {
                var requestTypeValue = attrs.myUniquekey;

                ctrl.$parsers.unshift(function(viewValue) {
                    // if (viewValue == undefined || viewValue == null
                    // || viewValue == "") {
                    // ctrl.$setValidity('required', false);
                    // } else {
                    // ctrl.$setValidity('required', true);
                    // }

                    setAsLoading(true);
                    setAsValid(false);

                    $http.get('/prism-cmti/2.1', {
                        params : {
                            requestType : requestTypeValue,
                            projectKey : viewValue.toUpperCase()
                        }
                    }).success(function(data) {
                        var isValid = data.isValid;
                        if (isValid) {
                            setAsLoading(false);
                            setAsValid(true);

                        } else {
                            setAsLoading(false);
                            setAsValid(false);
                        }
                    });

                    return viewValue;
                });

                function setAsLoading(bool) {
                    ctrl.$setValidity('loading', !bool);
                }

                function setAsValid(bool) {
                    ctrl.$setValidity('keyTaken', bool);
                }

            }
        };
    });

这是表单页面的控制器:

angular.module('psm3App').controller(
        'ProjectCreateCtrl',
        [ '$scope', '$http', '$routeParams', '$location',
                function($scope, $http, $routeParams, $location) {
                    $scope.save = function() {
                            $http.post('/prism-cmti/2.1', {requestType:'vcs.stream.addProject', project:$scope.project})
                            .success(function(data) {
                                $location.path("/");
                            });
                        };
                }]);

在此错误之前,不知何故,我也需要在自定义验证指令中处理所需的验证,如果我不这样做,所需的验证就会出错。现在想起来,也许这两个问题的根本原因是一样的:我的指令链接函数触发后,模型值就没有了。

顺便说一句,我正在使用 Angular1.3 Beta 18。

任何帮助表示赞赏。提前致谢。

Update:按照@ClarkPan的回答,我将代码更新为return viewValue in ctrl.$parsers.unshift()立即,这使得required验证现在运行良好,因此我不再需要下面的行。

        // if (viewValue == undefined || viewValue == null
                    // || viewValue == "") {
                    // ctrl.$setValidity('required', false);
                    // } else {
                    // ctrl.$setValidity('required', true);
                    // }

But the {{project.key}}还是没有更新。 然后我尝试在这里注释掉这两行:

                    setAsLoading(true);
                    setAsValid(false);

型号值{{project.key}}已更新。我知道如果任何验证失败,模型值将被清除,但我认为

                      function(data) {
                            var isValid = data.isValid;
                            if (isValid) {
                                setAsLoading(false);
                                setAsValid(true);
                            } else {
                                setAsLoading(false);
                                setAsValid(false);
                            }
                        }

in $http.get(...).success()应该在 $digest 周期中执行,这意味着应该更新模型值。

怎么了?


发生这种情况是因为如果模型中设置了任何无效标志,则 Angular 不会对范围和 $modelValue 进行任何更改。当您开始验证过程时,您将“keyTaken”有效性标志设置为 false。这告诉 Angular 不要将该值应用于模型。当 ajax 响应到达并且您将“keyTaken”有效性标志设置为 true 时,$modelValue 已设置为未定义,并且属性“key”消失了。尝试在 ajax 请求期间将所有有效性标志设置为 true。您必须避免在 ajax 调用之前调用 setAsLoading(true) 和 setAsValid(false) 并将所有有效性标志设置为 true。仅在ajax响应后设置有效性标志。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

触发自定义验证指令后,AngularJS ng-model 值丢失 的相关文章

  • 使用 org.apache.cordova.file 获取选定的文件大小

    使用 org apache cordova file 插件 我可以选择该文件并获取该文件的本机路径 之后 我必须限制用户根据文件大小选择文件 但我无法理解文件大小 我的问题是我无法使用该插件获取文件大小 为此我正在使用本教程 http th
  • 后备图像的角度指令

    如果单独服务器上的图像不存在 我想显示默认图像 是否有角度指令来完成此任务 不 但您可以创建一个 http jsfiddle net FdKKf http jsfiddle net FdKKf HTML img JS myApp direc
  • Angular Xeditable 下拉菜单 e-ng-change 不起作用

    我在用着角度可编辑 http vitalets github io angular xeditable editable tableapi 我需要根据下拉列表的值更改文本字段的值 但它不起作用 你能告诉我为什么吗 谢谢 Html td sp
  • 如何让 AngularJS 绑定到 A 标签的 title 属性?

    目的是让产品名称出现在缩略图的工具提示中 浏览器不会从 ng title 或 ng attr title 创建工具提示 我们使用 AngularJS 版本 1 0 7 您可以在任何属性前面添加 ng 或 ng attr Angular 将进
  • AngularUI Datepicker动态日期禁用

    我正在使用 AngularUI 日期选择器 我有两个相互影响的日期选择器 例如 一个是 开始日期 另一个是 结束日期 我不想为两个日期选择器创建验证 而是想消除无效日期的选项 即结束日期早于开始日期 反之亦然 有没有办法在选择日期时重新 触
  • WebSocket 连接失败:WebSocket 握手期间出错:意外的响应代码:400

    我正在尝试将 Socket io 与 Angular 集成 但在从客户端到服务器建立连接时遇到困难 我查看了其他相关问题 但我的问题发生在本地 所以中间没有网络服务器 这就是我的服务器代码的样子 const app express cons
  • 从字符串开头过滤 ng-repeat 元素

    我正在尝试 AngularJS 这是我的第一次尝试 我正在尝试使用 开头为 而不是 包含 之类的内容来过滤对象数组 但我不明白如何做到这一点 假设我有一个elements像这样的数组 amount 50 amount 25 如果我想过滤5两
  • Angular .controller() 在 .run() AngularJS 之前运行

    我在 run 中有一个 ajax 调用 该调用将一个变量加载到 rootScope 中 该变量在与视图关联的控制器中是需要的 有时 在刷新 F5 时 当 controller 加载时 rootScope SuperCategories 中没
  • 选项卡的 AngularJS 控制器

    我的页面中有三个选项卡 我在用着tabset and tab根据Angular 引导文档 https angular ui github io bootstrap tabs 我设置了一个控制器 div 其中有tabsetas div cla
  • 如何在 ionic 应用程序中显示 pdf 文件而无需下载

    我所做的事情 在应用程序浏览器中使用 使用谷歌文档 使用的网页视图 所以我尝试了所有这些方法来使用 ionic 在 Android 设备中显示 pdf 文件 但没有用 我可以在所有这些方法中看到下载按钮 谁能告诉我如何在没有用户下载选项的情
  • 从状态提供者的解析方法更改角度应用程序的状态

    我在我的角度应用程序中使用 ui router 目前我有两条路线 signin 和 user 最初 当用户单击登录按钮时 它显示 signin 我发送 ajax 请求并获取用户 ID 我将用户 ID 存储在 localstorage 中并将
  • 提交表单时 ng-required 不起作用

    我在带有 required 属性的输入文本框中包含以下代码 但是当我跳出该字段或提交表单时 它不会阻止表单提交并通知用户该字段是必填字段 div class col sm 8 div
  • angularjs路由,如何检查模板文件是否存在

    我在我的应用程序中使用 angularjs 一切都运行良好 但在加载模板之前我只想检查它是否确实存在于给定的路径上 这是我的代码 when page angularAMD route templateUrl function rp retu
  • Angular-ui State - 多个视图看不到我的解析数据

    由于某种原因 当使用多个命名视图 angular ui ui router 时 控制器看不到我的resolvedData 有人遇到过这个问题吗 stateProvider state page abstract true templateU
  • 处理量角器中的未知错误

    我有一个protractor通过配置多个浏览器进行设置multiCapabilities 在 browserstack 上运行测试 我的主要量角器规格 测试之一包含以下内容afterEach block afterEach function
  • 如何更新状态变更指令

    我有一个根状态 它定义了 Angular 模板的整体结构 在根状态下 我包含侧边栏 其中通过根据状态更改的指令具有动态菜单 像这样 state root abstract true url root templateUrl views ro
  • Angularjs 中字母数字的正则表达式

    我想要 angularJS 中字母数字字符的正则表达式 我尝试了一些正则表达式 例如 d a z 但它们允许我仅输入数字和字母 但我想要一个不允许我输入它们的正则表达式 例子 121232 abchfe abd 42232 5 是一些例子i
  • angular.copy() 和 JSON.parse(JSON.stringify()) 之间的区别?

    有人可以解释 angular copy 和 JSON parse JSON stringify 之间的区别吗 有吗 您会推荐使用什么 angular fromJson angular toJson 与 JSON parse JSON str
  • 在视图的 ng-animate 期间,“离开”视图仍然占用空间,而“进入”视图正在动画化

    我正在使用 AngularJS 1 1 5 并尝试使用 daneden 的 animate css 执行 ng animate 指令 我有几个使用路由设置的视图 我正在使用 Twitter Bootstrap 3 RC1 这是 ng vie
  • 如何检查摘要周期是否稳定(又名“Angular 完成编译了吗?”)

    tl dr 最初的问题是 如何在每个摘要周期触发回调 但潜在的问题更有趣 因为这回答了两个问题 所以我继续修改了标题 Context 在解决了所有依赖项 nginclude API 调用等之后 我试图控制 Angular 何时完成 HTML

随机推荐

  • Intellij / Android Studio 可以折叠注释吗?

    我在intellij中注释掉了这段代码 如您所见 此处无法折叠评论 然而 Webstorm 中相同的注释块可能会被折叠 有没有办法在intellij Android Studio中配置注释折叠 折叠任意选定的块 在编辑器中选择连续的代码片段
  • Django CSRF 框架有很多失败

    我的站点上的 CSRF Django 中间件 来自 SVN trunk 的版本 出现了很多失败 我得到的唯一错误是 CSRF 失败 原因 CSRF 令牌丢失或不正确 我如何诊断这些 CSRF 错误来自何处 我自己无法导致 CSRF 错误 但
  • 验证错误:向后分支上存在未初始化的对象/JVM 规范 4.10.2.4

    The JVM 规范 4 10 2 4 版本 7 最后一段 http docs oracle com javase specs jvms se7 html jvms 4 html jvms 4 10 2 4 says 如果未初始化对象的特殊
  • 更改 EditText setError 可绘制重力

    对于将要填充 RTL 文本的 EditText 有没有办法改变错误可绘制对象 当然还有弹出窗口 的重力 这是一个常规错误可绘制的示例 因此 由于输入的文本是 RTL 我希望弹出窗口显示在 EditText 的左侧 我尝试应用自定义绘图 但是
  • JavaFX 在列表视图中显示字符串附近的图像[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想在列表视图中的字符串附近显示一条消息我尝试查找它但我不太理解它我从网站上尝试了这个http docs oracle com javafx
  • 如何在 spring 中将图像转换为多部分文件

    我有一个图像文件并正在创建File具有该图像的对象 File file new File E Shared Data Images xyz jpg 上面的行正在创建一个file具有某种尺寸的物体 例如440272 我需要转换上面的image
  • 我使用 getifaddrs 得到错误的 IP 地址

    获取以太网指定IP地址的函数 char get ethernet ip const char ethernet char ip size t len struct ifaddrs ips int rc getifaddrs ips if r
  • 通过 mmap 文件进行 IPC:应该使用原子和/或易失性吗?

    我使用 mmap 文件在进程之间共享数据 代码是这样的 struct Shared int Data int file open file dat O RDWR Shared shared static cast
  • 在 Python 中利用蒙特卡洛预测收入

    我正在尝试在我的 Python 代码中实现蒙特卡罗模拟 这将帮助我确定实现与收入目标相关的各种阈值的几率 例如 我们每个财年达到 6 000 美元 7 000 美元或 8 000 美元的可能性有多大 我能够计算预期值 但还没有编写模拟代码
  • C中的浅拷贝和深拷贝

    我尝试用谷歌搜索这个 但结果只弹出面向对象的语言 根据我的理解 浅复制是复制结构的某些成员 所以可以说一个结构是 typedef struct node char ok int hi int yep struct node next nod
  • 如何避免在选项卡栏状态下堆叠导航历史记录

    选项卡 A 选项卡 B 选项卡 C 如下所示的状态 选项卡 a 选项卡 b 选项卡 c 我想关闭应用程序 就像在每个选项卡状态切换时没有导航历史记录一样 例如 我在选项卡 A 中 然后单击选项卡 B 然后从现在开始单击选项卡 C 如果用户按
  • 使用关联进行分页的 grails 中 Hibernate 查询的不同结果

    我有三个相互关联的班级 最初 我构建没有分页的查询 所有搜索结果都很好 但现在我需要分页并且不想打扰我的初始查询模式 有什么方法可以得到明显的结果 Class Department int id String name static has
  • 如何使用SwingWorker?

    朋友们 我正在开发一个java应用程序 这就是性能监控 在此基础上 我在一个类中获取值并在另一类中绘制图表 我想使用 Swingworker 交替执行这两堂课 ResultSet rs Connection conn null conn C
  • 如何让 Get-ADUser 在针对特定服务器时表现更好?

    我正在从域中的所有用户获取一系列属性 如果我不指定特定的域控制器 查询将在不到一秒的时间内返回有效结果 如果我指定目标控制器 即使在最近的域控制器上 结果也需要 18 秒才能返回 唯一的区别是我使用了目标服务器 Server serverN
  • 编号列表框

    我有一个已排序的列表框 需要显示每个项目的行号 在此演示中 我有一个带有 Name 字符串属性的 Person 类 列表框显示按姓名排序的人员列表 如何将行号添加到列表框的数据模板中 XAML
  • 使用 ASP.Net MVC 与 Web 表单相比的最大优势

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 使用其中一种相对于另一种有哪些优点 主要优点ASP net MVC are 启用对呈现的 HT
  • 使用 StringTemplate 中的参数调用 Java 函数?

    StringTemplate 允许程序员通过 getter 不带参数的函数 获取数据 我想知道是否可以使用字符串模板中的参数调用Java函数 有一个解决方法是滥用字典 这是一个实现 函数 的示例 用于限制列表中的项目数量 github 上的
  • 产生关键词附加值?

    仍在尝试找到在实际情况下我会在哪里使用 yield 关键字 我看到这个主题的帖子 C 中的yield关键字有什么用 https stackoverflow com questions 39476 what is the yield keyw
  • MVC3:从 HtmlHelper 对象获取视图路径的最佳方法是什么?

    我有一个 html 扩展方法来检索与视图位于同一文件夹中的文件的 URL Example Views Home Index cshtml Views Home Index js Views Home Index css 这是最好的方法吗 我
  • 触发自定义验证指令后,AngularJS ng-model 值丢失

    我创建了一个自定义验证指令并在表单中使用它 可以正常触发 但是触发验证后 发现model值就丢了 说我有 ng model project key 并在验证后 project key范围内不再存在 我认为我对 AngularJS 的理解是错