Ответ 1
Это даст вам желаемые результаты:
<input type="checkbox" ng-model="newObject[item.name]">
Вот рабочий план: http://plnkr.co/edit/ALHQtkjiUDzZVtTfLIOR?p=preview
Я пытаюсь создать набор флажков из массива объектов. Я хочу, чтобы флажки динамически отображали свою ng-модель в свойство нового объекта, который будет отправлен в массив.
То, что я имел в виду, это что-то вроде
<li ng-repeat="item in items">
<label>{{item.name}}</label>
<input type="checkbox" ng-model="newObject.{{item.name}}">
</li>
Это не работает, как видно на этом JSFiddle:
http://jsfiddle.net/GreenGeorge/NKjXB/2/
Помогает ли кто-нибудь?
Это даст вам желаемые результаты:
<input type="checkbox" ng-model="newObject[item.name]">
Вот рабочий план: http://plnkr.co/edit/ALHQtkjiUDzZVtTfLIOR?p=preview
ИЗМЕНИТЬ Как правильно отмечено в комментариях, используя это с ng-change, требуется предварительная предварительная версия "dummy" ng. Следует, однако, отметить, что, по-видимому, с 1.3 требуемые параметры были предоставлены рамками. Пожалуйста, ознакомьтесь с fooobar.com/questions/73633/... ниже! /EDIT
На всякий случай, когда вы похожи на меня, спотыкаясь о простой случай, имея более сложную задачу, это решение, которое я придумал для динамического связывания произвольных выражений с ng-model: http://plnkr.co/edit/ccdJTm0zBnqjntEQfAfx?p=preview
Метод: я создал директиву dynamicModel, которая принимает стандартное выражение angular, оценивает его и связывает результат с областью с помощью ng-model и $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);
});
}
};
}]);
Использование просто динамическая модель = "угловое выражение", где выражение углового выражения приводит к строке, которая используется как выражение для ng-модели.
Надеюсь, это избавит кого-то головную боль от необходимости придумать это решение.
С уважением, Юстус
С Angular 1.3 вы можете использовать директиву ng-model-options
для динамического назначения модели или привязки к выражению.
Вот 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 }">
Дополнительная информация о ngModelOptions
здесь: https://docs.angularjs.org/api/ng/directive/ngModelOptions
Это мой подход к поддержке более глубокого выражения, например. 'Model.level1.level2.value'
<input class="form-control" ng-model="Utility.safePath(model, item.modelPath).value">
где item.modelPath = 'level1.level2' и Утилита (model, 'level1.level2') - это функция утилиты, которая возвращает model.level1.level2
<!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>