Undefined или null для AngularJS
когда я пишу функции обработки часов, я проверяю newVal param на undefined и null. Почему AngularJS имеет такое поведение, но не имеет конкретного метода утилиты? Так что есть angular.isUndefined а не angular.isUndefinedOrNull. Это не трудно реализовать вручную, но как расширить угол, чтобы иметь эту функцию в каждом контроллере? Tnx.
Edit:
пример:
$scope.$watch("model", function(newVal) {
if (angular.isUndefined(newVal) || newVal == null) return;
// do somethings with newVal
}
является ли общепринятой практикой обрабатывать такие путь?
Edit 2:
пример JSFiddle (http://jsfiddle.net/ubA9r/):
<div ng-app="App">
<div ng-controller="MainCtrl">
<select ng-model="model" ng-options="m for m in models">
<option value="" class="ng-binding">Choose model</option>
</select>
{{model}}
</div>
</div>
var app = angular.module("App", []);
var MainCtrl = function($scope) {
$scope.models = ['Apple', 'Banana'];
$scope.$watch("model", function(newVal) {
console.log(newVal);
});
};
6 ответов:
вы всегда можете добавить ее именно для вашего приложения
angular.isUndefinedOrNull = function(val) { return angular.isUndefined(val) || val === null }
Я предлагаю вам написать свой собственный сервис коммунальных услуг. Вы можете включить службу в каждый контроллер или создать родительский контроллер, назначить служебную службу своей области, а затем каждый дочерний контроллер унаследует ее без необходимости ее включения.
Пример:http://plnkr.co/edit/NI7V9cLkQmEtWO36CPXy?p=preview
var app = angular.module('plunker', []); app.controller('MainCtrl', function($scope, Utils) { $scope.utils = Utils; }); app.controller('ChildCtrl', function($scope, Utils) { $scope.undefined1 = Utils.isUndefinedOrNull(1); // standard DI $scope.undefined2 = $scope.utils.isUndefinedOrNull(1); // MainCtrl is parent }); app.factory('Utils', function() { var service = { isUndefinedOrNull: function(obj) { return !angular.isDefined(obj) || obj===null; } } return service; });или вы можете добавить его в rootScope, а также. Всего несколько вариантов расширения углового с вашим собственным функция полезности.
Я задал тот же вопрос лодашь сопровождающие некоторое время назад и они ответили, упомянув
!=оператор может быть использован здесь:if(newVal != null) { // newVal is defined }это использует тип принуждения JavaScript, чтобы проверить значение для
undefinedилиnull.если вы используете JSHint для Линта вашего кода, добавьте следующие блоки комментариев, чтобы сказать ему, что вы знаете, что делаете - большую часть времени
!=считается плохим./* jshint -W116 */ if(newVal != null) { /* jshint +W116 */ // newVal is defined }
почему бы просто не использовать
angular.isObjectс отрицанием? например,if (!angular.isObject(obj)) { return; }
ответ @ STEVER является удовлетворительным. Тем не менее, я подумал, что может быть полезно опубликовать немного другой подход. Я использую метод isValue, который возвращает true для всех значений, кроме null, undefined, NaN и Infinity. Сосредоточение в NaN с нулевым и неопределенным является реальным преимуществом функции для меня. Объединение Бесконечности с null и undefined более спорно, но, честно говоря, не так интересно для моего кода, потому что я практически никогда не использую бесконечность.
следующий код вдохновлен Y. Lang.isValue. Вот это источник для Y. Lang.isValue.
/** * A convenience method for detecting a legitimate non-null value. * Returns false for null/undefined/NaN/Infinity, true for other values, * including 0/false/'' * @method isValue * @static * @param o The item to test. * @return {boolean} true if it is not null/undefined/NaN || false. */ angular.isValue = function(val) { return !(val === null || !angular.isDefined(val) || (angular.isNumber(val) && !isFinite(val))); };или как часть фабрики
.factory('lang', function () { return { /** * A convenience method for detecting a legitimate non-null value. * Returns false for null/undefined/NaN/Infinity, true for other values, * including 0/false/'' * @method isValue * @static * @param o The item to test. * @return {boolean} true if it is not null/undefined/NaN || false. */ isValue: function(val) { return !(val === null || !angular.isDefined(val) || (angular.isNumber(val) && !isFinite(val))); }; })
лодашь предоставляет сокращенный метод для проверки, если неопределенный или null:
_.isNil(yourVariable)
Comments