2014-11-16 7 views
3

Недавно я пришел в AngularJS и попытался создать регистрационную форму, где я бы заполнил список стран из моей конфигурации JavaScript, которая широко используется в другом месте, поэтому я сохраняю ее как объект JS.Iterate config array в html-шаблоне через угловые директивы?

Я пытаюсь использовать ng-repeat-start и * -end на моем входе select, но он терпит неудачу.

Главный вопрос: как мне загрузить массив стран и повторить его в моем шаблоне?

Edit: 30.11.2014 - Лучшие примеры

HTML:

<div class="form-group"> 
       <label for="phone">Country</label> 
       <select-country ng-model="credentials.country"></select-country> 
       <pre>{{credentials.country}}</pre> 
      </div> 

Файл:

/public/directives/countrySelector.directive.js

содержание Директива:

'use strict'; 

angular.module('app', []) 
.value('countries', [ 
    {name: 'Afghanistan', code: 'AF'}, 
    {name: 'Åland Islands', code: 'AX'} 
]) 
.directive('selectCountry', ['countries', function (countries) { 
    function link (scope, element, attrs) { 
     scope.countries = countries; 
    } 

    return { 
     template: '<select ng-options="country[1] as country[0] for country in countries"' + 
     '  ng-model="credentials.country">' + 
     '</select>', 
     link: link, 
     scope: { 
      credentialsCountry: '=' 
     } 
    }; 
}]); 
+0

Вы ищете ответ, который позволяет хранить массив 'countries' в * отдельном * файле проекта? Файл, который вы можете запросить через AJAX и загружать асинхронно? –

+0

Да, также. Помимо правильной загрузки его в область полномочий с помощью контроллера – deb0rian

ответ

3

Я не думаю, что вам нужно создать новую директиву для этого. Существует уже встроенная в select директива для углового, поэтому вы делаете больше работы для себя, чем необходимо. Итак, что вы может do - это ввести эту услугу в ваш контроллер для страницы, а затем привязать службу к сфере действия контроллера, как и для этой директивы. Это будет в конечном итоге выглядеть примерно так:

angular.module('app', []) 
.value('countries', [ 
    {name: 'Afghanistan', code: 'AF'}, 
    {name: 'Åland Islands', code: 'AX'} 
]); 

и у вас есть контроллер

app.controller('whateverTheControllerIs', ['countries', '$scope', function (countries, $scope) { 
    $scope.countries = countries; 
}); 

, а затем ваша сфера доступна для шаблона

<div class="form-group"> 
    <label for="phone">Country</label> 
    <select ng-options="country.name for country in countries" ng-model="credentials.country"></select> 
    <pre>{{credentials.country}}</pre> 
</div> 

В качестве примечания:, если вы хотите узнать о лучших практиках для последней версии Angular 1. *. Прочитайте все, что говорит Тодд Мотто.

+0

Мой основной модуль приложения называется «сигналы», я зарегистрировал свой массив значений, используя '' angular.module ('signals', []). Value ('countries', [...]); '' , чтобы сделать его глобально доступным для каждого контроллера, но он выдает мне ошибку: «Ошибка: [$ injector: unpr] Неизвестный поставщик: countriesProvider <- countries'', когда я пытаюсь использовать его в контроллере и вводить его как ' страны. – deb0rian

+1

Fratyr, так же, как в директиве: http://plnkr.co/edit/OIGGitze5LLehDes2MQ8?p=preview –

+0

Нет, он никогда не загружается. Grunt просматривает этот файл, но Angular его не находит. Я пробовал, требуя его перед областью, и после. Размещение в модуле приложения и тот, который пытается его использовать. Не повезло. Пробовал это: '' angular.module ('users'). Value ('Countries', []) '' Также попытался '' angular.module ('signal') '' // главный модуль, а затем потребовал его в контроллер. Не повезло:/Смотрите мой плункер: http://plnkr.co/edit/kNE6T0bf44bOUKFvkwOY – deb0rian

2

Это хорошая идея создать директивы для вещей, которые можно было бы часто использовать повторно, например, селектор страны. Вы хотите ввести свой countries в директиву, где затем вы можете перебрать его с помощью ng-options. Plunker: http://plnkr.co/edit/zfkeLNQ0LHxR7FB0nM18?p=preview

.directive('selectCountry', ['countries', function (countries) { 
    var directive = { 
    template: '<select ng-options="country[1] as country[0] for country in countries"' + 
       '  ng-model="ngModel">' + 
       '</select>', 
    link: link, 
    scope: { 
     ngModel: '=' 
    } 
    }; 

    return directive; 

    function link (scope, element, attrs) { 
    scope.countries = countries; 
    } 
}]); 
+0

Плохая вещь в этом состоит в том, что пример стека MEAN использует объект $ scope.credentials для отправки регистрационной формы, поэтому я не могу интегрировать селектор стран и телефонных кодов в учетные данные, поскольку они загружаются в разное время и не могут отправлять выбранные данные .. :( – deb0rian

+0

не совсем понятно, что вы имеете в виду. Если данные формы находятся в объекте '$ scope.credentials' вы можете просто установить «ng-model» для селектора страны на «credentials.country» или аналогичный. У вас есть пример кода? – user2943490

+0

Вы можете увидеть новые примеры, представленные в оригинальной публикации. Благодаря! – deb0rian

7

просто заменить country[0] и country[1] с country.code и country.name

http://plnkr.co/edit/OIGGitze5LLehDes2MQ8?p=preview или я что-то пропустил?

+0

Спасибо, это помогло мне устранить проблему с отображением, теперь проблема заключается в том, чтобы зарегистрировать ее правильно! :) – deb0rian

Смежные вопросы