#javascript #angularjs #for-in-loop
#javascript #angularjs #для-в-цикле
Вопрос:
В $scope.model
моем контроллере есть объект. Его свойства извлекаются с моего сервера при запуске и привязываются к полям ввода в представлении.
<input type="text" ng-model="model.name" placeholder="name"/>
<input type="email" ng-model="model.email" placeholder="email"/>
<!-- ... -->
Когда я хочу перебрать все свойства этой модели, которые поступили либо с сервера, либо с полей формы. Например, мне нужно это, чтобы найти свойства, которые фактически изменились, чтобы отправлять их только обратно на сервер.
$scope.save = function() {
// Filter changed properties
var changed = {};
for (i in $scope.model) {
if (i in initial amp;amp; model[i] == initial[i])
continue;
changed[i] = model[i];
}
// Send them to server
// ...
}
Однако я не знаю, добавляет ли AngularJS внутренние свойства к моему объекту. Так безопасно ли использовать этот синтаксис или я должен перебирать некоторые специфические свойства AngularJS, которые я не должен видеть или даже манипулировать?
Комментарии:
1. Уважаемый downvoter, не могли бы вы предложить улучшение?
2. angularjs автоматически свяжет свойство, не требуя ручного цикла, а также будет следить за вашим объектом при его изменении
3. Вы
console.log( $scope.model )
пытались проверить, добавил ли Angular что-нибудь к объекту?4. Хотя причина, по которой он хочет использовать
for .. in
, может быть неясной, это законный вопрос.5. @FrancisStalin Я отредактировал код, чтобы охватить мой реальный вариант использования
for ... in
. Если вы знаете лучший способ, пожалуйста, скажите мне!
Ответ №1:
Angular имеет собственный префикс $
so, если вы хотите быть в безопасности, убедитесь, что ключ не начинается с этого.
Если, например, вы используете ng-repeat
angular, будет добавлено $$hashKey
свойство.
И вы никогда не узнаете, начнут ли они добавлять другие свойства в будущем, но если они это сделают, они (скорее всего) будут следовать своему соглашению, добавляя к нему префикс.
$scope.save = function() {
var changed = {};
// Filter changed properties
for (i in $scope.model) {
// Skip Angular prefix
if (i.length amp;amp; i[0] == '
Ответ №2:
В этом случае angular не добавляет никаких новых свойств, поэтому вы можете легко перебирать свойства.
)
continue;
// Skip if not changed
if (i in initial amp;amp; model[i] == initial[i])
continue;
// Add to result
changed[i] = model[i];
}
// Send them to server
// ...
}
Ответ №2:
В этом случае angular не добавляет никаких новых свойств, поэтому вы можете легко перебирать свойства.