2016-12-14 4 views
1

У меня есть два меню выбора, которые заполняются данными AJAX JSON, полученными после загрузки страницы. Они связаны их собственной моделью и выглядят так;Установить значение ng-options на основе значения строки AJAX

<select name="category" 
     id="category" 
     ng-model="category" 
     ng-options="category as category.name for category in categories track by category.name"> 
    <option value=''>Select category</option> 
</select> 

<select name="product" 
     id="product" 
     ng-disabled="!category" 
     ng-model="product" 
     ng-options="product for product in category.products"> 
    <option value=''>Select product</option> 
</select> 

После того, как форма отправлена ​​в API, он возвращает объект origin, состоящий из обоих category и product строк, если они используются.

Я подумал, что я должен был бы установить $scope.category и/или $scope.product на возвращаемые данные origin для предварительного выбора элемента в меню/s выбора;

.success(function(data)) { 
... 
$scope.category = data.origin.category 
... 
} 

Но это не работает ...

ответ

1

Вы можете использовать ng-init выбрать начальное значение

<select ng-init="initDefaultCategory(categories)" name="category" id="category" ng-model="category" ng-options="category as category.name for category in categories track by category.name"> 
    <option value=''>Select category</option> 
    </select> 

    <select ng-init="initDefaultProduct(category.products)" name="product" id="product" ng-disabled="!category" ng-model="product" ng-options="product for product in category.products"> 
    <option value=''>Select product</option> 
    </select> 

Working DEMO

редактирует

Если вы хотите, чтобы выбрать значение по умолчанию, вы можете сделать что-то вроде этого

контроллер

$scope.initDefaultCategory = function(categories, value) { 
    if (categories.length > 0) 
     $scope.category = categories.filter(e => e.name == value)[0]; 
    } 

И вы можете передать значение в ng-init

<select ng-init="initDefaultCategory(categories,'All')" name="category" id="category" ng-model="category" ng-options="category as category.name for category in categories track by category.name"> 
    <option value=''>Select category</option> 
    </select> 

Edited Demo

+0

Спасибо Нагавееру. Может быть, я не был достаточно ясен - категории заполняются одним и тем же вызовом AJAX, поэтому init для проверки по категориям будет терпеть неудачу, потому что они еще не существуют. Кроме того, я не хочу устанавливать значение по умолчанию, но соответствует определенному элементу на основе строкового значения – Alex

+0

@Alex Я обновил свой ответ. Надеюсь это поможет!! –

+0

Я думаю, что мы приближаемся, но есть пара вопросов. Во-первых, ng-init не будет работать, потому что набор данных, который создает категории, также требуется после загрузки pagte через AJAX. Поэтому я получаю ошибку «Не могу прочитать свойство» с нулевой ошибкой. Это имеет смысл, поскольку категории не заполняются в init. Кроме того, моя IDE по какой-то причине не любит операторов «e => e.name» ?! Еще раз спасибо – Alex

1
.success(function(data)) { 
    $scope.category = $scope.categories.filter(function(val,key){ 
     return data.origin.category['yourKey']==val['yourKey'] 
    })[0] 
}