2016-11-15 12 views
1

Рассмотрев документацию и многочисленные вопросы здесь, на SO, я не могу найти решение для моей проблемы. У меня есть раскрывающийся список, который заполняется данными из базы данных. Чтобы заполнить это, я использую ngOptions с помощью метода select as.ngOptions: выберите выбранное значение ИЛИ выберите значение по умолчанию

<select ng-model="modelthing" ng-options="item.id as item.description for item in categories"> 

Теперь то, что я хочу, это вариант по умолчанию (который может быть изменен администратором, поэтому он не может быть зашиты в качестве <option>), если значение не было выбрано ранее, и выбранное значение, когда есть один из тех.

$scope.categories = $http.get(thingurl) 
    .then(function (result) { 
     $scope.categories = result.data; 
     //$scope.modelthing= $scope.categories[1].id; 
     $scope.modelthing= 1; 
    }); 

Есть две проблемы с этим, прежде всего [1] выбирает вторую запись в данных JSON, а не тот, который имеет 1 как ключ. И второе: Solved this with help from Icycool in their comment below.

Когда я держать открытие и закрытие населенное форму примерно половину времени я получаю значение по умолчанию, а другая половина я получаю реальное выбранное значение. Это, очевидно, потому, что ng-model="modelthing" перезаписывается, когда я извлекаю данные из заполненной формы и код работает синхронно. Есть ли способ убедиться, что это работает асинхронно? Или мой подход просто неправильный?


Другие вещи, которые я пробовал до сих пор:

Я заметил, что, когда я использовал select as item in items фразу в ngOptions, варианты в мой выбор есть value="number:3" вместо простого числа. Using track by in ngOptions вместо select as исправил это, но было так неожиданно, что мои выбранные значения не совпадали с отображенными в раскрывающемся списке, потому что они равны 3 вместо number:3.

Решение, которое делает работы, но чувствует себя очень Неугловые и немного грязный, чтобы проверить при инициализации формы, если modelthing модели пуста, и если да, то установите его значение по умолчанию.

+0

обновите сообщение своими данными json. – Aravind

ответ

1

Использование id проще в управлении, чем при использовании самого объекта.

<select ng-model="modelthing" 
     ng-options="item.id as item.description for item in categories"> 

$scope.categories = $http.get(thingurl) 
    .then(function (result) { 
     $scope.categories = result.data; 
     $scope.modelthing = 1; // your model is bound to id not the object 
    }); 

Обратите внимание, что integer1 и string"1" не может рассматриваться так же, в этом случае, он должен соответствовать типу возвращаемого в формате JSON.


Часть 2: Вы имеете в виду модель и выбор происходит из различных $http звонков? Это может быть исправлено путем проверки существующего значения перед нанесением значения

function getData() { 
    $http.then(function(data) { 
    $scope.selections = data; 
    if (!$scope.selected) $scope.selected = data[0].id; 
    }) 
} 

function getSelected() { 
    $http.then(function(data) { 
    $scope.selected = data.id; 
    }) 
} 

по умолчанию По этому пути окончательного значения после того, как асинхронная вызовы решительности всегда будет получен идентификатором, независимо от порядка.

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

+0

А, да, вы правы, это правильный способ объявить ng-модель. Благодаря! Хотя он не решает синхронных вызовов ... это объявление и тот, который захватывает всю модель, бок о бок, по-видимому, иногда вызывает значение по умолчанию, а иногда и выбранное значение. :( – Kablam

+1

@Kablam updated – Icycool

+0

Это работает! Является ли это принятым «Угловым способом» для этого? И уверены ли вы, что это делает асинхронным вызовы? Например, если функция 'getData()' неожиданно заканчивается перед 'getSelected() 'не является значением' $ scope.selected', все еще пустым в этой точке? (я имею в виду, я не могу его сломать).работает безупречно до сих пор, это просто из любопытства). Благодаря! – Kablam

0
  • Вам нужно добавить новый объект (с отрицательным значением или 0) ваших массива(категория).

  • назначить последний объект для вашей модели (modelthing) объекта.

Пожалуйста, попробуйте это мой код ниже (в противном случае получить его на ключ)

$scope.categories = $http.get(thingurl) 
    .then(function (result) { 
     $scope.categories = result.data; 
     $scope.categories.Push(id:"0",description:"Select"); 
     $scope.modelthing = $scope.categories[$scope.categories.length - 1]; 
    }); 

Update:

1) Есть две проблемы с этим, первый из всех [1] выбирает вторую запись в данных json, а не одну, которая имеет 1 как ключ

Массив индексов начинается с 0, а не с 1. Так, если ключ выглядит 1, но значение индекса равно 0. Вы используете массив не Список_массивов. Имеет смысл?

Просто поставить 0 вместо 1, как

$scope.categories[0].id

2) Когда я держу открытие и закрытие населенной формы примерно половину времени я получаю значение по умолчанию, а другая половина, я получаю фактическое выбранное значение. Это, очевидно, потому, что ng-model = "modelthing" перезаписывается, когда я извлекаю данные из заполненной формы, а код работает синхронно. Есть ли способ убедиться, что это работает асинхронно? Или мой подход просто неправильный?

Просто объявить объект модели на глобальном уровне с пустыми данными

$scope.categories = []; 
$scope.modelthing = {}; 

Update 2

3) Я пытался выбрать значение на основе его ключа, а не его место в массиве, поскольку ключи не обязательно помещаются в массив в порядке возрастания

var key = 1; //it's not static 
for(var i=0;i<$scope.categories.length;i++) 
{ 
    if($scope.categories[i].id==key)// Once your key is correct,then the value will be assign 
    { 
    $scope.modelthing = $scope.categories[i] 
    } 
} 
+0

Это будет работать для значения по умолчанию, которое является «Выбрать». Я хочу, чтобы предварительно выбрать значение из набора данных, который я получаю с сервера, я хочу установить выпадающее меню (например) значение с ключом = 3. – Kablam

+0

@Kablam Пожалуйста, проверьте мои изменения –

+0

Да, я вижу теперь, я получаю то, что вы пытаетесь сказать. Я знаю, что массив начинается с 0. Я пытался выбрать значение на основе его ключа, а не его место в массиве, потому что ключи не обязательно помещаются в массив в порядке возрастания. – Kablam