Comparar 2 objetos

publicado por: Anonymous

En mi app.js

var variable = {tipo: 2, variables: [20, 35, 50] };
$scope.test = variable;
$scope.test2 = angular.copy(variable);

En mi index.html

<input type="number" ng-model="test.tipo" />
<input type="number" ng-model="test2.tipo" />

<div ng-repeat="var in variables">
  <input type="number" ng-model="test.variables[$index]" />
  <input type="number" ng-model="test2.variables[$index]" />
</div>

<textarea ng-required=""></texarea>

¿Cómo puedo hacer para que el textarea sea obligatorio, si por ejemplo el valor de test2.tipo lo cambio por un 3, pero si lo vuelvo a cambiar a 2 ya no sea obligatorio?

¿Alguna sugerencia?

solución

Creo que no entiendo muy bien tu pregunta, pero intentaré guiarte en cómo hacer que el textarea sea required o no dependiendo de algunos parámetros. En tu pregunta dices:

¿Cómo puedo hacer para que el textarea sea obligatorio, si por ejemplo, el valor de test2.tipo lo cambio por un 3, pero si lo vuelvo a cambiar a 2 ya no sea obligatorio.

Lo que entiendo de la anterior pregunta es que quieres que el textarea sea required si el valor de test2.tipo es desigual de 2.

Po lo tanto la menarea de lograrlo sería:

<textarea ng-required="test2.tipo != 2"></textarea>

Sin embargo, guiándome por el título de tu pregunta:

Comparar 2 objetos

Supongo que lo que quieres es comparar el valor del parámetro tipo en los dos objetos. Por ejemplo, el siguiente código sitúa el parámetro required en el textarea solo si los parámetos tipo de los dos objetos son diferentes, si son iguales deja de ser requerido:

Vista:

<div ng-app="myApp">

    <div ng-controller="myController">

        <input type="number" ng-model="test1.tipo" />
        <input type="number" ng-model="test2.tipo" />

        <textarea ng-required="test1.tipo != test2.tipo" ng-class="{'required': test1.tipo != test2.tipo}"></textarea>

    </div>

</div>

Controlador:

var app = angular.module("myApp", []);

app.controller("myController", ["$scope", function ($scope) {

    $scope.test1 = {tipo: 2, variables: [20, 35, 50] };
    $scope.test2 = angular.copy($scope.test1);

}]);

Aquí tienes un jsfiddle funcional con el anterior código.

EDIT: Siguiendo tu último comentario lo que deseas es comparar dos objetos completamente y si no son iguales entonces situar el parámetro required en el textarea. Lo más óptimo para lograr esto es usar la función angular.equals que te sirve para comparar dos objetos o dos valores. La técnica que he utilizado es llamar a un método en el $scope que actualice la variable arequal cada vez que lo desee (en este caso la actualizo cada vez que se varíen los valores de los inputs).

_x000D_

_x000D_

var app = angular.module("myApp", []);_x000D_
_x000D_
app.controller("myController", ["$scope", function($scope) {_x000D_
_x000D_
  $scope.areequal = true;_x000D_
  $scope.test1 = {tipo: 2, variables: [20, 35, 50]};_x000D_
  $scope.test2 = angular.copy($scope.test1);_x000D_
_x000D_
  $scope.compare = function() {_x000D_
    $scope.areequal = angular.equals($scope.test1, $scope.test2);_x000D_
  };_x000D_
_x000D_
}]);

_x000D_

.required {_x000D_
  border-color: red;_x000D_
}

_x000D_

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>_x000D_
<div ng-app="myApp">_x000D_
  <div ng-controller="myController">_x000D_
    <input type="number" ng-model="test1.tipo" ng-change="compare()" />_x000D_
    <input type="number" ng-model="test2.tipo" ng-change="compare()" />_x000D_
    <br>_x000D_
    <br>_x000D_
    <textarea ng-required="!areequal" ng-class="{'required': !areequal}"></textarea>_x000D_
  </div>_x000D_
</div>

_x000D_

_x000D_

_x000D_

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *