angularjs - оптимизировать отправку формы (автоматически) на основе грязной области видимости

Проблемное пространство

У меня есть проблема, когда я отправляю форму, основанную на выполняемых критериях, а не на кнопке отправки формы.

Допустим, у меня есть 3 раскрывающихся списка, первые два сгруппированы, но один должен быть выбран, то есть я могу выбрать один или другой, но не могу оставить их пустыми, 3-е поле является обязательным для заполнения.

После этого страница автоматически получает результаты.

Допустим, у меня есть флажки и еще несколько выпадающих меню. Любые будущие варианты выбора из трех упомянутых раскрывающихся списков, флажков и раскрывающихся списков автоматически фильтруют результаты.

Что я знаю

Теперь, прочитав угловую документацию, я проверил $ ​​dirty, $pristine и операции с обоими, такими как $setDirty и $setPristine; Тем не менее, кажется, что это для FormController

Итак, я предполагаю, что это полезно для всего объема. Я не видел никакой склонности, которую я могу выяснить для выбранных областей.

Что у меня пока

В общем, я надеялся, что буду использовать функции слежения за прицелом, но я мало что знаю об этом. Я создал один контроллер для своего приложения и одну область видимости, так как это казалось мне наиболее простым. У меня есть сторонние плагины, которые играют определенную роль в области:

$ scope.3rdpartyConfig = {prop1: [], prop2: getData ()}

Я не думаю, что что-то подобное будет полезно для проверки отправки формы, если я собираюсь проверить состояние $ dirty в моей форме.

Затем я подумал о старом способе, которым я обычно что-то делал, но "оскорблял" его:

так что я бы что-то вроде:

<input type="checkbox" ng-model="state.Checked" ng-change="checkIfWeCanSubmitThenSubmit()" id="ng-change-example1" />

Так что у меня будут ng-изменения и ng-клики по всей моей html-форме, попадающие в эту функцию, где функция будет выглядеть следующим образом:

$scope.checkIfWeCanSubmitThenSubmit= function() {
    var validated = false;
    //check to see if dropdown1 or dropdown2 are selected
    //check to see if dropdown3 is selected
    // add more here per requirement

    //if the above are true, then validated = true

    if (validated)
    {
         //add dropdown4 and 5, and checkbox groups into filter
    }

    submit();
}

Но я думал, что это не угловой способ делать вещи, поскольку это, конечно, не облегчается.

Я надеялся, что область действия предложит какой-то способ, где я могу проверить, какие части моей области грязные или нет, прежде чем я смогу отправлять и извлекать данные, или если есть лучший способ, чем добавление этой функции в каждый HTML элемент; как наличие какого-то трекера, который я могу проверить и посмотреть.

Это напоминает мне, что я не хочу иметь серию $scope.$ Watch, просто будет слишком много работы для привязки к каждому фрагменту HTML-кода, если только нет способа наблюдать за областью действия. Коллекция конкретных переменных области, я бы не возражал.

как (простите за псевдокод):

$scope.$watch('dropdown1, dropdown2, dropdown4', function(dirty, pristine)
{
    if (dirty)
    { blah blah blah }
});

Изменить (28.02.2013):

Я попытался сделать это так:

$scope.masterCriteria =
[
    { DropDown1: $scope.AppModel.Dropdown1},
    { DropDown2: $scope.AppModel.Dropdown2 },
    { DropDown3: $scope.AppModel.Dropdown3 },
    { Checkbox1: $scope.AppModel.Checkbox1 },
    { Checkbox2: $scope.AppModel.Checkbox2 }
];

$scope.$watch('masterCriteria', function (newVal) {
    if (newVal) { logger.info("did I change?"); }
}, true);

Наблюдатель ничего не обнаружил, и любые значения, которые я изменил в области AppModel, не были обнаружены в $watch. Стоило попробовать, все еще пытаясь понять это.

1 ответ

Вы можете немного изменить свою модель и групповые поля, связанные с формой ввода вместе. Поместите их в один объект. Как это:

 $scope.state = { checkbox1: false, checkbox2: true, ... }

Позже привязать поля ввода к полю state объект:

 <input ng-model="state.checkbox1" ... >

И смотри state Объект для перехвата всех обновлений вложенных полей:

 $scope.$watch('state', ...

Пример JsFiddle здесь

Другие вопросы по тегам