Javascript 如果变量本身未定义,如何检查属性是否未定义?

Javascript 如果变量本身未定义,如何检查属性是否未定义?,javascript,angularjs,Javascript,Angularjs,我想用Angular做一些基本的表单验证。我的表格有以下代码: <div class="col-xs-12 col-md-6" ng-controller="contactFormCtrl"> <form class="contact-form" ng-show="formVisible" novalidate> <div class="form-group">

我想用Angular做一些基本的表单验证。我的表格有以下代码:

<div class="col-xs-12 col-md-6" ng-controller="contactFormCtrl">
                    <form class="contact-form" ng-show="formVisible" novalidate>
                        <div class="form-group">
                            <label for="name">Name</label><small> Required</small> 
                            <input type="text" class="form-control" ng-model="contact.name" id="name" placeholder="Name" required>
                            <div ng-show="nameEmpty">Please enter your name</div>
                        </div>
                        <div class="form-group">
                            <label for="email">E-mail</label><small> Required</small> 
                            <input type="email" class="form-control" ng-model="contact.email" id="email" placeholder="E-mail" required>
                            <div ng-show="emailEmpty">Please enter your e-mail address</div>
                        </div>
                        <div class="form-group">
                            <label for="tel">Telephone</label>
                            <input type="text" class="form-control" ng-model="contact.tel" id="tel" placeholder="Telephone">
                        </div>
                        <div class="form-group">
                            <label for="message">Message</label>
                            <textarea class="form-control" rows="5" ng-model="contact.message" required></textarea>
                        </div>
                        <input type="submit" ng-click="submit(contact)" class="btn btn-success" value="Submit">
                        <input type="button" ng-click="reset()" class="btn btn-primary" value="Reset">
                    </form>
                    <div ng-show="submissionSuccess">
                        <h4>Your message was sent successfully! We'll get back to you as soon as possible</h4>
                        <button class="btn btn-info" ng-click="reset()">Send another message</button>
                    </div>
                </div>
表单已经用红色突出显示了空字段或格式错误的字段,但现在我也在尝试阻止提交无效表单。我的想法是检查$scope.contact.user和$scope.contact.email变量是否未定义,然后从那里开始。但是,当我运行此操作并尝试提交并清空表单时,会出现一个错误:

TypeError:无法读取未定义的属性“name”

但是,如果我在“名称”字段中输入了一些内容,然后用一封空电子邮件提交,它将按预期工作。这导致人们认为这是一个初始化问题,但我认为我已经用$scope.contact={}初始化了控制器第一行中的变量


我做错了什么?

代码学校提供了有关表单验证的完整教程,所以请观看并执行。 靠近的第一个按钮将执行标记中的ng submitt=SOMEmETHOD。通过表单名称获取$valid属性,并使用此条件禁用按钮。此外,还可以使用现成的角度验证方法,如ng minlenght等清晰易用的指令。对于实时http请求,请使用watcher或assync

$scope.$watch'contact.email',functionnewValue,oldValue{ ifnewValue!==未定义{ $timeoutfunction{ REQUEST.successfunction{ scope.reqs='这就是它' } },600; }
};

\u.i空需要下划线.js

$scope.test = "Test";

angular.isUndefined($scope.test);           // false
angular.isUndefined($scope.test.newField);  // true
_.isEmpty($scope.test);                     // false

$scope.test = "";

angular.isUndefined($scope.test);           // false
_.isEmpty($scope.test);                     // true

$scope.myObject = {};

angular.isUndefined($scope.test);           // false
_.isEmpty($scope.myObject );                // true

但我认为你的代码都是正确的。如果在调用函数submit之前初始化$scope.contact={},则不会出现错误。因此,或者在初始化$scope.contact后调用函数submit,或者在调用函数后覆盖该值。

我没有足够的时间发布完整答案,但是FWIW您可以在iffield!==未定义,而不是使用typeof。另外,角度也有。虽然这不能解决您的问题,但它确实为您提供了另一种解决方案。实际上,不要使用iffield!==未定义,因为未定义可以被覆盖。相反,请使用一个类似于-\的帮助程序库。isUndefinedfieldI正在使用该代码的修改版本。它非常适合字段的实时验证,但它对阻止表单提交没有任何作用-当您单击“提交”时,它仍会调用提交函数。您可以使用ng Submit指令并在该指令中检查表单的有效性,如ng Submit='form.$valid&&form.Submit',来防止这种情况。有关更多信息,请参阅。
$scope.test = "Test";

angular.isUndefined($scope.test);           // false
angular.isUndefined($scope.test.newField);  // true
_.isEmpty($scope.test);                     // false

$scope.test = "";

angular.isUndefined($scope.test);           // false
_.isEmpty($scope.test);                     // true

$scope.myObject = {};

angular.isUndefined($scope.test);           // false
_.isEmpty($scope.myObject );                // true