как обнаружить изменение внутри формы угловой схемы?

Я использую форму угловой схемы, и мне нужно определить, когда сгенерированный элемент удален.

Для вашего удобства я сделал плункер: https://plnkr.co/edit/ogaO8MBmNtxYBPHR67NC?p=info

файл контроллера:

   //model form
    vm.modelForm = {"beneficiaries":[]};

    /*
    ================
    schema
    ================
    */
    vm.schema = {
      "type": "object",
      "title": "Beneficiario",
      "required": [
        "beneficiaries"
      ],
      "properties": {
        "beneficiaries": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "number",
                "description": "Monto a transferir",
                "minimum": 1,
                "maximum": 500,
                "validationMessage": {
                   101: "El valor de este campo debe ser de al menos {{schema.minimum}} Bs",
                   103: "{{viewValue}} Bs es mayor que el máximo permitido para una transferencia: {{schema.maximum}} Bs",
                   302: "Este campo es requerido"
                }
              },
              "spam": {
                "title": "Spam",
                "type": "boolean",
                "default": true
              },
              "comment": {
                "type": "string",
                "maxLength": 20,
                "validationMessage": "Cantidad máxima de carácteres excedida"
              }
            },
            "required": [
              "name",
              "comment"
            ]
          }
        }
      }
    };

    /*
    ===============
    form
    ===============
    */
    vm.form = [
      {
        "type": "help",
        "helpvalue": "<h4>Transferencias y pagos</h4><h5>Lista de elementos seleccionados</h5>"
      },
      {
        "key": "beneficiaries",
        "title": "Selección",
        "autocomplete": "off",
        "add": null,
        "style": {
          "add": "btn-success"
        },
        "items": [
          {
            "key": "beneficiaries[].name",
            "title": "Monto Bs",
            "feedback": false
          },
          {
            "key": "beneficiaries[].spam",
            "type": "checkbox",
            "title": "Agregar a pagos frecuentes",
            "condition": "model.beneficiaries[arrayIndex].name"
          },
          {
            "key": "beneficiaries[].description",
            "title": "Descripción",
            "feedback": false
          }
        ],
        "startEmpty": true
      },
      {
        "type": "submit",
        "style": "btn-success btn-block",
        "title": "Agregar"
      }
    ];

    //form data
    vm.elements = [
      {
        "idE":1,
        "name": "Elemento 1",
        "selected": false
      },
      {
        "idE":2,
        "name": "Elemento 2",
        "selected": false
      },
      {
        "idE":3,
        "name": "Elemento 3",
        "selected": false
      },
      {
        "idE":4,
        "name": "Elemento 4",
        "selected": false
      }
    ];


    //function to select a element to put it inside of form
    vm.select = function(){
      //active elements
      var actives = _.filter(vm.elements, function(element) { 
        return element.selected == true; 

      });

      vm.modelForm.beneficiaries = new Array(actives.length);

      _.forEach(actives, function(value, key) {
        vm.modelForm.beneficiaries[key] = {"spam":true};
      });

    };

    //watch schema form
    $scope.$watch(function(){
      return vm.modelForm.beneficiaries;
    }, function(newValue, oldValue){
      if(newValue === oldValue) {
       return;
      }
      console.log("change");
    });

Я могу определить, когда элемент удален, если я изменю модель формы, но если я попытаюсь удалить элемент этой формы, используя «x» из любого сгенерированного элемента, невозможно определить, изменилась ли модель.

Итак, просматривая плункер, я попытался обнаружить изменение с помощью $watch над моделью формы, но ничего не происходит, если я удаляю элемент, щелкнув "X", мне нужно определить, когда это действие будет выполнено. .


person fablexis    schedule 29.01.2016    source источник
comment
ты не можешь использовать Object.observe() внутри своих часов? чтобы увидеть, изменилось ли что-то между newValue и oldValue   -  person Jordy van Eijk    schedule 29.01.2016


Ответы (1)


Ссылка, скорее всего, не изменится, поэтому вам придется использовать третий параметр в операторе $watch:

$scope.$watch(function () {
    return vm.modelForm.beneficiaries;
}, function (newValue, oldValue) {
    if (newValue === oldValue) {
        return;
    }
    console.log("change");
}, true);

,true говорит ему выполнить полный обход объекта, чтобы проверить, изменился ли он. Посмотрите objectEquality здесь: https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watch

person Mathew Berg    schedule 29.01.2016