I love `Bootstrap-Select` and I am currently using it through the help of a directive made by another user [`joaoneto/angular-bootstrap-select`](https://github.com/joaoneto/angular-bootstrap-select) and it works as intended except when I try to fill my `<select>` element with an `$http` or in my case a `dataService` wrapper. I seem to get some timing issue, the data comes after the `selectpicker` got displayed/refreshed and then I end up having an empty Bootstrap-Select list.. though with Firebug, I do see the list of values in the now hidden `<select>`. If I then go in console and manually execute a `$('.selectpicker').selectpicker('refresh')` it then works.   
I got it temporarily working by doing a patch and adding a `.selectpicker('refresh')` inside a `$timeout` but as you know it's not ideal since we're using `jQuery` directly in an ngController...ouch!  

So I believe the directive is possibly missing a watcher or at least something to trigger that the `ngModel` got changed or updated.   

Html sample code: 

```
<div class="col-sm-5">
    <select name="language" class="form-control show-tick" 
        ng-model="vm.profile.language" 
        selectpicker data-live-search="true"
        ng-options="language.value as language.name for language in vm.languages">
    </select>
    <!-- also tried with an ng-repeat, which has the same effect -->
</div>

```

then inside my Angular Controller: 

```
// get list of languages from DB
dataService
    .getLanguages()
    .then(function(data) {  
        vm.languages = data;

        // need a timeout patch to properly refresh the Bootstrap-Select selectpicker 
        // not so good to use this inside an ngController but it's the only working way I have found
        $timeout(function() {
            $('.selectpicker, select[selectpicker]').selectpicker('refresh');
        }, 1);
    }); 

```

and here is the directive made by (joaoneto) on [GitHub for Angular-Bootstrap-Select](https://github.com/joaoneto/angular-bootstrap-select)

```
function selectpickerDirective($parse, $timeout) {
  return {
    restrict: 'A',
    priority: 1000,
    link: function (scope, element, attrs) {
      function refresh(newVal) {
        scope.$applyAsync(function () {
          if (attrs.ngOptions && /track by/.test(attrs.ngOptions)) element.val(newVal);
          element.selectpicker('refresh');
        });
      }

      attrs.$observe('spTheme', function (val) {
        $timeout(function () {
          element.data('selectpicker').$button.removeClass(function (i, c) {
            return (c.match(/(^|\s)?btn-\S+/g) || []).join(' ');
          });
          element.selectpicker('setStyle', val);
        });
      });

      $timeout(function () {
        element.selectpicker($parse(attrs.selectpicker)());
        element.selectpicker('refresh');
      });

      if (attrs.ngModel) {
        scope.$watch(attrs.ngModel, refresh, true);
      }

      if (attrs.ngDisabled) {
        scope.$watch(attrs.ngDisabled, refresh, true);
      }

      scope.$on('$destroy', function () {
        $timeout(function () {
          element.selectpicker('destroy');
        });
      });
    }
  };
}

```