Estoy tratando de generar un conjunto de casillas de verificación a partir de una matriz de objetos. Mi objetivo es que las casillas de verificación asignen dinámicamente su modelo ng a una propiedad del nuevo objeto que se enviará a la matriz.
Lo que tenía en mente es algo como
<li ng-repeat="item in items">
<label>{{item.name}}</label>
<input type="checkbox" ng-model="newObject.{{item.name}}">
</li>
Esto no funciona como se puede ver en este JSFiddle:
http://jsfiddle.net/GreenGeorge/NKjXB/2/
¿Alguien puede ayudar?
javascript
angularjs
George Ananda Eman
fuente
fuente
item.name
veces debería apuntar anewObject['x']
y otras anewObject['x']['y']
.EDITAR Como se señaló correctamente en los comentarios, usar esto con ng-change requiere que un modelo ng "ficticio" esté presente de antemano. Sin embargo, cabe señalar que aparentemente con 1.3 el marco ha proporcionado las opciones necesarias. Consulte https://stackoverflow.com/a/28365515/3497830 a continuación. /EDITAR
En caso de que sea como yo tropezando con un caso simple mientras tengo una tarea más compleja, esta es la solución que se me ocurrió para vincular dinámicamente expresiones arbitrarias a ng-model: http://plnkr.co/edit/ccdJTm0zBnqjntEQfAfx?p = vista previa
Método: Creé una directiva dynamicModel que toma una expresión angular estándar, la evalúa y vincula el resultado al alcance a través de ng-model y $ compile.
var app = angular.module('plunker', []); app.controller('MainCtrl', function($scope) { $scope.data = {}; $scope.testvalue = 'data.foo'; $scope.eval = $scope.$eval; }); var app = angular.module('plunker', []); app.controller('MainCtrl', function($scope) { $scope.data = {}; $scope.testvalue = 'data.foo'; $scope.eval = $scope.$eval; }); app.directive('dynamicModel', ['$compile', function ($compile) { return { 'link': function(scope, element, attrs) { scope.$watch(attrs.dynamicModel, function(dynamicModel) { if (attrs.ngModel == dynamicModel || !dynamicModel) return; element.attr('ng-model', dynamicModel); if (dynamicModel == '') { element.removeAttr('ng-model'); } // Unbind all previous event handlers, this is // necessary to remove previously linked models. element.unbind(); $compile(element)(scope); }); } }; }]);
El uso es simplemente modelo dinámico = "expresión angular" donde expresión angular da como resultado una cadena que se utiliza como expresión para ng-modelo.
Espero que esto le ahorre a alguien el dolor de cabeza de tener que encontrar esta solución.
Saludos, Justus
fuente
Con Angular 1.3, puede usar la
ng-model-options
directiva para asignar dinámicamente el modelo o enlazar a una expresión.Aquí hay un plunkr: http://plnkr.co/edit/65EBiySUc1iWCWG6Ov98?p=preview
<input type="text" ng-model="name"><br> <input type="text" ng-model="user.name" ng-model-options="{ getterSetter: true }">
Más información
ngModelOptions
aquí: https://docs.angularjs.org/api/ng/directive/ngModelOptionsfuente
Este es mi enfoque para admitir una expresión más profunda, por ejemplo, 'model.level1.level2.value'
<input class="form-control" ng-model="Utility.safePath(model, item.modelPath).value">
donde item.modelPath = 'level1.level2' y Utility (model, 'level1.level2') es la función de utilidad que devuelve model.level1.level2
fuente
<!DOCTYPE html> <html> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script> <body> <div ng-app="myApp" ng-controller="myCtrl"> <form name="priceForm" ng-submit="submitPriceForm()"> <div ng-repeat="x in [].constructor(9) track by $index"> <label> Person {{$index+1}} <span class="warning-text">*</span> </label> <input type="number" class="form-control" name="person{{$index+1}}" ng-model="price['person'+($index+1)]" /> </div> <button>Save</button> </form> </div> <script> var app = angular.module('myApp', []); app.controller('myCtrl', function ($scope) { $scope.price = []; $scope.submitPriceForm = function () { //objects be like $scope.price=[{person1:value},{person2:value}....] console.log($scope.price); } }); </script> </body> </html>
fuente