Undefined or null for AngularJS
Kiedy piszę funkcje obsługi zegarka sprawdzam newVal param na undefined
i null
. Dlaczego AngularJS ma takie zachowanie, ale nie ma konkretnej metody użytkowej? Więc jest angular.isUndefined
, ale nie angular.isUndefinedOrNull
. Nie jest trudno zaimplementować to ręcznie, ale jak rozszerzyć angular, aby mieć tę funkcję w każdym kontrolerze? Tnx.
Edit :
Przykład:
$scope.$watch("model", function(newVal) {
if (angular.isUndefined(newVal) || newVal == null) return;
// do somethings with newVal
}
Czy jest to powszechnie akceptowana praktyka, aby radzić sobie w ten sposób?
Edytuj 2:
JSFiddle przykład ( 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 answers
Zawsze możesz dodać go dokładnie do swojej aplikacji
angular.isUndefinedOrNull = function(val) {
return angular.isUndefined(val) || val === null
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-20 20:12:49
Moja propozycja dla ciebie to napisanie własnego serwisu użytkowego. Możesz włączyć usługę do każdego kontrolera lub utworzyć kontroler nadrzędny, przypisać usługę narzędzia do swojego zakresu, a następnie każdy kontroler potomny odziedziczy ją bez konieczności dołączania go.
Przykład: 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;
});
Możesz też dodać go do rootScope. Tylko kilka opcji rozszerzenia kątowego za pomocą własnych funkcji użytkowych.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-21 21:54:36
Zadałem to samo pytanie opiekunom lodash jakiś czas temu i odpowiedzieli, wspominając o operatorze !=
, który może być użyty tutaj:
if(newVal != null) {
// newVal is defined
}
To używa JavaScript ' S Type coercion, aby sprawdzić wartość dla undefined
lub null
.
Jeśli używasz JSHint do lintowania kodu, dodaj następujące bloki komentarzy, aby powiedzieć, że wiesz, co robisz-większość czasu !=
jest uważana za złą.
/* jshint -W116 */
if(newVal != null) {
/* jshint +W116 */
// newVal is defined
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-25 11:58:00
Dlaczego po prostu nie użyć angular.isObject
z negacją? np.
if (!angular.isObject(obj)) {
return;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-17 15:27:37
@ STEVER odpowiedź jest zadowalająca. Jednak pomyślałem, że może być przydatne, aby opublikować nieco inne podejście. Używam metody o nazwie isValue, która zwraca true dla wszystkich wartości oprócz null, undefined, NaN i Infinity. Dodawanie NaN przez null i undefined jest dla mnie prawdziwą korzyścią z tej funkcji. Wrzucanie nieskończoności z null i undefined jest bardziej dyskusyjne, ale szczerze mówiąc nie jest to interesujące dla mojego kodu, ponieważ praktycznie nigdy nie używam nieskończoności.
Następujący kod to zainspirowany Y. Lang.isValue . Oto źródło dla 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)));
};
Lub jako część fabryki
.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)));
};
})
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-24 21:19:18
Lodash dostarcza skróconą metodę sprawdzania, czy undefined czy null:
_.isNil(yourVariable)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-23 19:56:39