【问题标题】:Angular js ng-show not working properlyAngular js ng-show 无法正常工作
【发布时间】:2015-03-15 22:33:08
【问题描述】:

我有一个在我的 html 表单提交时执行的函数,如果在服务器上处理表单时出现错误,则错误将作为 json 返回。我想向用户显示这些错误,但由于某种原因,我的错误 div 容器上的 ng-show 从未显示。

HTML代码:

<form class="form-horizontal" role="form" name="registerForm" ng-controller="RegisterController as register" ng-submit="registerForm.$valid && register()" novalidate>
        <div class="form-group">
            <div class="col-md-3">
                <label for="email">Email: </label>
            </div>

            <div class="col-md-9">
                <input type="email" id="email" name="email" ng-model="d.email" class="form-control" ng-required/>
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-3">
                <label for="password">Password</label>
            </div>

            <div class="col-md-9">
                <input type="password" id="password" name="password" ng-model="d.password" class="form-control" ng-required/>
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-3">
                <label for="confPassword">Confirm Password</label>
            </div>

            <div class="col-md-9">
                <input type="password" id="password_confirmation" name="password_confirmation" ng-model="d.password_confirmation" nx-equal-ex="d.password" class="form-control" ng-required/>
            </div>
        </div>

        <span class="help-block errorMessages" ng-show="d.errors.length">
            <div class="alert alert-danger">
                <strong>Whoops!</strong> There were some problems with your input.<br><br>
                <ul class="list">
                    <li ng-repeat="error in d.errors"><% error %></li>
                </ul>
            </div>
        </span>

        <div class="form-group">
            <div class="col-md-12">
                <br/>
                <hr>
                <button class="big-red-button" type="submit">Register <i class="glyphicon glyphicon-chevron-right"></i></button>
            </div>
        </div>
    </form>

Register.js 控制器:

(function() {

    angular.module('vendor').controller('RegisterController', ['$http', '$scope', function($http, $scope) {

        $scope.d = {};
        $scope.d.errors = {};

        $scope.register = function() {

            $.ajax({
                type: "POST",
                url: "/auth/register",
                headers : {
                    'X-XSRF-Token': $("meta[name='csrf_token']").attr("content")
                },
                data: {
                    email: $scope.d.email,
                    password: $scope.d.password,
                    password_confirmation: $scope.d.password_confirmation
                },
                dataType: 'json',
                success: function(data) {
                    alert(result[0]);
                },
                error: function(xhr, status, err) {
                    var responseJSON = JSON.parse(xhr.responseText);
                    $scope.d.errors = responseJSON;
                    //alert($scope.d.errors.name);

                }
            });
        };

    }]);

}) ();

当错误返回页面时没有任何反应,ng-show 不显示代码。

【问题讨论】:

  • 长度始终存在,所以如果之前的错误中没有保存任何内容,则需要指定ng-show="d.errors.length &gt; 0"之类的内容。
  • 试过了,不行
  • 然后,使用ng-show="d.errors !== undefined"
  • 哇,这确实有效,没想到它会:D

标签: json angularjs ng-show


【解决方案1】:

使用数据绑定来显示错误:

<ul class="list">
 <li ng-repeat="error in d.errors"><% error %>{{error}}</li>
</ul>

【讨论】:

  • 对不起,我不明白,这看起来像是我的代码中已有的内容。
  • 如何在视图中进行数据绑定?只有这样 ?你不应该使用 {{error}}
  • 我将其更改为 因为它与我的 laravel 刀片模板冲突
  • 啊,我明白你做了什么。好吧,让我检查一下
【解决方案2】:

我可能错了,但 $.ajax 是 jQuery 吗?如果是这样,

角度宇宙之外的任何东西都需要手动触发摘要循环。

所以你有两个选择。

在 $scope.d.errors = responseJSON 添加之后

$scope.$apply();

或使用$http

 $http.post({
   type: "POST",
   url: "/auth/register",
   headers : {
     'X-XSRF-Token': $("meta[name='csrf_token']").attr("content")
   },
   data: {
     email: $scope.d.email,
     password: $scope.d.password,
     password_confirmation: $scope.d.password_confirmation
   }
 }).success(
   function(data) {
     alert(data[0]);
   }
 ).error(function(err, status, headers, conf) {
     $scope.d.errors = data;
     //alert($scope.d.errors.name);
 });

【讨论】:

  • $scope.$apply() 不起作用,并且在使用 $http 时遇到了一个完全不同的问题,这就是我切换到 $ajax 的原因
  • $scope.$apply() 应该按预期更新更新您的 dom。你试过这个 $http sn-p 吗?没有测试它,但它应该可以工作
  • 当我使用 $http.post 时它工作得很好,我的问题是,响应总是最终是一个 html 页面而不是 json,这仅仅是因为 laravel 验证检查页面请求是否是ajax 请求它返回一个 json 对象,如果没有则它会进行重定向。
猜你喜欢
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
相关资源
最近更新 更多