Могу ли я использовать for … в синтаксисе для угловых моделей?

#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 не добавляет никаких новых свойств, поэтому вы можете легко перебирать свойства.