0

Вот мой JSon объект:AngularJS ngOptions трэк не установлен весь объект ngModel

$scope.todos = [{ 
    name: 'angular', 
    field: ['a', 'b', 'c', 'd'], 
    id: 1 
    }, { 
    name: 'asd', 
    field: ['a', 'b', 'c', 'd', 'e'], 
    id: 2 
    }]; 

я даю выбрать как:

<select ng-model="dashboard.type" ng-options="item as item.name for item in todos track by item.name"></select> 

Теперь, когда выбран вариант я хочу другой выбрать, какие итерацию после ngModel предыдущего выбора. Следующий выглядит как:

<select ng-model="dashboard.label" ng-options="item as item for item in dashboard.type.field"></select> 

Он отлично работает, когда я выбираю опцию вручную, но если их это значение в dashboard.type (например: $scope.dashboard.type.name = 'qwe') в моем сценарии, он использует track by выбрать вариант и сохранить его в dashboard.type вместо сохранения всего объекта он просто сохраняет значение, используемое в опции track by.

Соотношение dashboard.type:

  1. когда я выбираю опцию вручную: {"name":"qwe","field":["a","b","c","d","f"],"id":3}
  2. Когда трэк используется: {"name":"qwe"}

ПРИМЕЧАНИЕ: я не могу использовать track by item. Он должен быть свойством объекта item. Он может быть либо name, либо id.

Адрес plnkr.

Edit:

Как отмечалось многими, я хотел бы уточнить, что я не могу инициализировать объект любого значения todos списка. Это связано с тем, что значение dashboard.type.name будет отличаться каждый раз, а список todos варьируется от 10 до 100 единиц. Теперь мне нужно перечислить список todos, если todos[index].name==someName и назначить соответствующий объект. Я активно пытаюсь избежать этого суждения (потому что должен быть лучший способ).

Примечание: Я также попытался с помощью ng-change и назначить реальный объект для dashboard.type.name но это работает только тогда, когда выбрана опция вручную, что уже, кажется, работает хорошо. Он не назначает объект, если используется track by.

ВАЖНО:$scope.dashboard.type.name = 'qwe' - всего лишь пример. Значение $scope.dashboard.type.name может меняться каждый раз, когда страница загружается.

PS: Также я должен был упомянуть об этом раньше. Простите, я плохой!

+0

просто изменить инициализацию как это $ scope.dashboard = {}; \t $ scope.dashboard.type = {} \t $ scope.dashboard.type = { имя: 'QWE', поле: [ 'а', 'б', 'с', 'd', «е '], ID: 3 }; –

+0

если бы я мог сделать последнюю часть без итерации через список 'todos', чем да, это сработает. PS: Я обновил вопрос, пожалуйста, проверьте еще раз. –

+0

в этом случае вызовите функцию на ng-init и инициализируйте там на основе значения, которое вы хотите –

ответ

0

Эта проблема не из-за дорожки. ng-модель установлена ​​с $scope.dashboard.type.name = 'qwe', $scope.dashboard.type = {name : 'qwe'}. Вместо того, чтобы вы использовали $scope.dashboard.type = $scope.todos[2];, если вы хотите установить значение для выбора.

Edited plunker

0

Для инициализации модального значения по умолчанию, вы можете использовать нг-Init. Например

<select ng-init="dashboard.type = todos[2]" ng-model="dashboard.type" ng-options="item as item.name for item in todos track by item.name"> 
    </select> 
0

вызова этой функции на нг-INIT в HTML

ng-init ="initialize();" 

в Js

$scope.dashboard={};//initialize object 
$scope.dashboard.type ={}//initialize object 

$scope.initialize =function(){ 


//no need to iterate if it is certain that your Id and index is always same suppose your initial id is 3 

//then 
var currId =3;//suppose initial id is there 
$scope.dashboard.type =$scope.todos[currId] 

} 

здесь codepen ибо http://codepen.io/vkvicky-vasudev/pen/MeexmK

+0

Я только что дал случайное условие, если вы можете использовать собственное условие –

+0

, но здесь вы используете '.forEach()' для циклического перехода по списку и установки допустимого объекта в '$ scope.dashboard.type' как i что это решение работает, но мой вопрос в том, что: есть ли лучший способ сделать это иначе, чем перебирать список? –

+0

, который может быть выполнен, если вы знаете идентификатор, который должен быть выбран вначале, и если он уверен, что ваш идентификатор всегда совпадает с индексом массива, найдите измененную ручку кода –