Я пытаюсь построить калькулятор для дневных цен в Angular.
Каждое место в франшизе компании имеет отдельные цены за каждый день. Поэтому я думал, что нужно создать форму, сначала выбрать, которая позволяет вам выбрать местоположение, а затем серию флажков для дней.
У меня возникают проблемы с ng-true-value в флажках, которые выберете правильные цены из моего json файла.
UPDATE: Добавлен Plunkr: http://plnkr.co/edit/MDmrqaH1VzLBzjd5eHgT?p=preview
Рассмотрим этот код:
<p class="kind_section">Choose location</p>
<select ng-model="formData.location" ng-options="location.title for location in data.bso"></select>
<p class="kind_section">Select days</p>
<input type="checkbox" ng-model="location.day.mon" ng-change="calculatePrice()" ng-true-value="{{data.bso[formData.location.ID].prices.monday}}" ng-false-value="0">Ma
<input type="checkbox" ng-model="location.day.tue" ng-change="calculatePrice()" ng-true-value="{{data.bso[formData.location.ID].prices.tuesday}}" ng-false-value="0">Di<br />
<input type="checkbox" ng-model="location.day.wed" ng-change="calculatePrice()" ng-true-value="{{data.bso[formData.location.ID].prices.wednesday}}" ng-false-value="0">Wo
<input type="checkbox" ng-model="location.day.thu" ng-change="calculatePrice()" ng-true-value="{{data.bso[formData.location.ID].prices.thursday}}" ng-false-value="0">Do<br />
<input type="checkbox" ng-model="location.day.fri" ng-change="calculatePrice()" ng-true-value="{{data.bso[formData.location.ID].prices.friday}}" ng-false-value="0">Vr
Сначала выберите set formData с идентификатором местоположения, затем я хочу использовать этот идентификатор, чтобы выбрать дневные цены для соответствующего местоположения и установить их для ng-true-value.
Я использую ng-true-value="{{data.bso[formData.location.ID].prices.monday}}"
для этого. Это не работает.
Когда я устанавливаю идентификатор вручную, как ng-true-value="{{data.bso[0].prices.monday}}"
, он работает. Почему результат выбора не подбирается с помощью ng-true-value?
Это мой json файл:
$scope.data = {
"bso": [
{
"ID": 0,
"title": "Locatie 1",
"prices": {
"monday": 130,
"tuesday": 130,
"wednesday": 200,
"thursday":130,
"friday": 130
}
},
{
"ID": 1,
"title": "Locatie 2",
"prices": {
"monday": 430,
"tuesday": 530,
"wednesday": 600,
"thursday":990,
"friday": 730
}
}
]
};
Кажется, что ng-true-value
не принимает непостоянные выражения. Из docs (v1.3.0):
Некоторые атрибуты, используемые в сочетании с ngModel (например, ngTrueValue или ngFalseValue), будут принимать только постоянные выражения.
Примеры с использованием константных выражений включают:
<input type="checkbox" ng-model="..." ng-true-value="'truthyValue'">
<input type="checkbox" ng-model="..." ng-false-value="0">
Примеры не константных выражений включают:
<input type="checkbox" ng-model="..." ng-true-value="someValue">
<input type="checkbox" ng-model="..." ng-false-value="{foo: someScopeValue}">
Идеальный обходной путь, вероятно, вызовет метод Controller на ng-click
или ng-change
, внутри которого вы сможете проанализировать все флажки для правдивых или непрактичных значений.
Другой подход заключается в том, чтобы отложить создание флажка до тех пор, пока значение не будет готово (по области или тому подобное).
В моем случае я загружал значение через http, который не был в области, когда был установлен флажок. Поэтому я просто завернул его в ng-if.
<div class="checkbox" ng-if="viewData.conditionId != undefined">
<label>
<input type="checkbox" ng-true-value="{{'\''+ viewData.conditionId + '\''}}" ng-false-value="undefined" ng-model="model.conditionId" required />
I agree
</label>
</div>
Это отлично сработало для моего сценария. Ваш немного отличается, но тот же самый принцип должен применяться - задержка создания флажка до тех пор, пока вы не узнаете, что связанное значение существует.
И да, кажется, нужны глупые кавычки.
Выражение в ng-true-value будет оцениваться только один раз, поэтому оно не будет динамическим.
Один альтернативный подход заключается в вычислении значений в обратном вызове ng-change.
Для полного примера см. мою вилку http://plnkr.co/edit/9zYS3OZ0sSkXX9rHwcgv?p=preview.
В html:
<input type="checkbox" ng-model="selectedDays.monday" ng-change="calculatePrice()" /> Mon
<input type="checkbox" ng-model="selectedDays.tuesday" ng-change="calculatePrice()" /> Tue <br />
<input type="checkbox" ng-model="selectedDays.wednesday" ng-change="calculatePrice()" /> Wed
<input type="checkbox" ng-model="selectedDays.thursday" ng-change="calculatePrice()" /> Thu <br />
<input type="checkbox" ng-model="selectedDays.friday" ng-change="calculatePrice()" /> Fri
и в контроллере:
$scope.calculatePrice = function(){
$scope.formData.location.day = {};
angular.forEach($scope.selectedDays, function (selected, day) {
if (selected) {
$scope.formData.location.day[day.slice(0, 3)] = $scope.data.bso[$scope.formData.location.ID].prices[day];
}
});
}
$scope.selectedDays = {};
ngTrueValue
.