0

Я пытаюсь создать динамическую форму на основе объекта. Например: Я хотел бы, что сгенерированные полей выбора будет содержать параметры, если задано, в противном случае завод будет получать их с помощью Ajax, что-то вроде этого:

Markup:

<select ng-repeat="select in selects" 
     ng-init="options = refactor.options(select)" 
     ng-options="option in options"> 
</select> 

Контроллер:

myApp.controller('MyCtrl', function($scope, refactor) { 
    $scope.refactor = refactor; 
    $scope.selects = [ 
      { text: "Country", value="chosen.country", options=["France", "England"] }, 
      { text: "Gender", value="chosen.gender", options="/gender" } 
     ] 
}); 

Фабрика:

myApp.factory('refactor', function($scope, $http) { 
    return { 
    options: function(select) { 
     if(typeof(select.options) === 'object') { return select.options }; 
     // otherwise assume select.options is 
     // a path to fetch options by ajax: 
     $http.get(select.options).success(function(data) { 
     select.options = data; // data == ['male', 'female'] 
     }); 

     return []; // placeholder until promise is fulfilled 
    } 
    } 
}) 

данные ($ scope.selects) г ets обновляется, как ожидалось, но DOM не является, что, вероятно, означает, что refactor.options() не будет снова вызван в ответ на изменение. Я попытался принудительно выполнить обновление, передав объект области на фабрику и применив к нему $ apply, но он не работает.

Что мне не хватает?

+1

попробовать это, если он работает 'нг-параметры = «option in select.options» ' – Abdul23

+0

На первой итерации один из вариантов ионы vars - это строка (путь, '/ gender'), которая не является итерируемой и, вероятно, вызывает исключение. – Kludge

+0

@ Abdul23, ваше общее направление было истинным в конце концов: переменная, которую я инициализировала в ng-init, не повлияла после обновления select.options, поэтому итерация select.options вместо этого в конечном итоге решила проблему. Я предлагаю вам опубликовать это как ответ. Благодарю. – Kludge

ответ

0

Вы должны использовать ng-init="data = refactor.options(select)" поэтому после получения данных из ajax данных будет заполнено с options, то вы можете использовать ng-options, как вместо ng-options="option in data.options".

Markup

<select ng-repeat="select in selects" 
    ng-init="data = refactor.options(select)" 
    ng-options="option in data.options"> 
</select> 
+0

нет свойств «данных» в параметрах (?) – Kludge

+0

@ Kludge, это мой bad..misplaced «options» в ответе. Попробуйте обновленный ответ. –

+0

Похоже, вы просто изменили имя параметров, содержащих переменную от «параметров» до «данных» ... Я ценю тот факт, что вы пытаетесь помочь, но проблема в том, что DOM не обновляется, хотя данные есть. – Kludge

0

Вы должны попробовать это

myApp.factory('refactor', function($scope, $http) { 

return { 
    options: function(select) { 
       var menuItems={ 
        options:[] 
        } 

       if(typeof(select.options) === 'object'){ 
        menuItems.options=select.options 
       }; 

       // otherwise assume select.options is 
       // a path to fetch options by ajax: 

       $http.get(select.options).success(function(data) { 
        select.options = data; 
        menuItems.options=data;// data == ['male', 'female'] 
       }); 

       return menuItems; // placeholder until promise is fulfilled 
      } 
     } 
}); 

Тогда внутри вашей точки зрения он должен идти, как этот

<select ng-repeat="select in selects" 
    ng-init="menuItems= refactor.options(select)" 
    ng-options="option in menuItems.options"> 
</select> 
Смежные вопросы