Angular UI type-heading разница между 1.0 и 1.2

Я нашел вопрос SO, который показал мне, как использовать Angular UI — тип Bootstrap с объектом $http. Он работал нормально (см. первый рывок), пока я не изменил версию Angular на 1.2RC2, на которой он сейчас не работает. Я недостаточно хорошо знаю код Angular, чтобы понять, почему. Что изменилось между 1.05 и 1.2, чтобы сломать этот код

Этот планк работает: http://plnkr.co/edit/eGG9Kj?p=preview

Этот планк не работает: http://plnkr.co/edit/HdVBpp?p=preview< /а>

Соответствующий код

HTML

<html ng-app="plunker">
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0-rc.2/angular.js"></script>
    <script src="http://angular-ui.github.com/bootstrap/ui-bootstrap-tpls-0.2.0.js"></script>
    <script src="example.js"></script>
    <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet">
  </head>
  <body>

    <alert type="'info'" >Typeahead from  <a href="http://angular-ui.github.com/bootstrap/">http://angular-ui.github.com/bootstrap/</a>"</alert>
    <div class='container-fluid' ng-controller="TypeaheadCtrl">
        <pre>Model: {{result | json}}</pre>
        <input type="text" ng-model="result" typeahead="suggestion for suggestion in cities($viewValue)">
    </div>
  </body>
</html>

Javascript

angular.module('plunker', ['ui.bootstrap']);
function TypeaheadCtrl($scope, $http, limitToFilter) {

  //http://www.geobytes.com/free-ajax-cities-jsonp-api.htm

  $scope.cities = function(cityName) {
    return $http.jsonp("http://gd.geobytes.com/AutoCompleteCity?callback=JSON_CALLBACK &filter=US&q="+cityName).then(function(response){
      return limitToFilter(response.data, 15);
    });
  };

}

Он не работает внутри кода пользовательского интерфейса Angular в строке 1564, где он не может найти совпадения matches.length, потому что они не определены.


person Nathaniel Johnson    schedule 07.10.2013    source источник


Ответы (1)


https://github.com/angular/angular.js/issues/4158

https://github.com/angular-ui/bootstrap/issues/949

Это напрямую связано с этим изменением в 1.2.0-rc2. Раньше, когда вызов функции оценивался с использованием scope.$eval и возвращал промис, он возвращал необработанный объект промиса. Внедренное изменение сделало так, что возвращаемые значения обещания автоматически разрешаются, в результате чего значение становится неопределенным. Поскольку директива typeahead не ожидает такого поведения, происходит сбой.

Вы можете временно исправить проблему, если ваша функция немного взломает промис:

promise.$$v = promise;

$$v — это значение, которое angular будет внутренне возвращать при автоматическом разрешении промисов, и оно также присвоит результат промиса этому значению.

Я бы порекомендовал придерживаться rc1 или дождаться rc3, так как эта проблема и функциональность, вероятно, будут изменены.

Просто дополнительная информация — я считаю, что до RC2 объекты промисов, оцениваемые в области видимости, разрешались автоматически, но вызовы функций, которые возвращали промисы, — нет. Это изменение было внесено для обеспечения согласованной функциональности при обработке промисов.

person Adam    schedule 07.10.2013
comment
Упомянутый вами хак не решает эту конкретную проблему, но возвращает к RC1, и я предполагаю, что RC3 вызовет разрешение в пользовательском интерфейсе Angular. Я считаю, что совершил ошибку, не оставив 1.05. Команда angular не должна помечать их как RC при изменении функций. RC должен быть после бета-тестирования. - person Nathaniel Johnson; 07.10.2013