angular typeahead $viewValue не обновляется после переименования

Я использую angular v.1.2.28, и у меня есть сложный элемент, который сочетает в себе раскрывающийся список с вводом текста:

<div class="btn-group vl-dropdown-container " style="width:100%" dropdown
                     ng-class="{disabledFunctionalityAndClick:isReadOnly}">

                    <a class="vl-dropdown-toggle vl-pf-dd-button" dropdown-toggle>
                        <span class="caret"></span>
                    </a>

                    <div style="overflow: hidden;">
                        <input placeholder="Select a discount table" class="vl-autocomplete  um-dd-input"
                               ng-model="selectedTypeaheadValue"
                               typeahead="discount as discount.id for discount in discountTablePool | filter:$viewValue"
                               typeahead-on-select="selectDiscountTable($item)"
                               typeahead-editable="false"
                               ng-blur="validateSelectedDiscount($viewValue)"/>
                    </div>
                    <ul class="dropdown-menu" role="menu">
                        <li ng-repeat="discountTable in discountTablePool track by $index">
                            <a href dropdown-toggle ng-click="selectDiscountTable(discountTable)">{{discountTable
                                .id}}</a>
                        </li>
                    </ul>

                </div>

Я также даю пользователю возможность переименовать текущее выбранное значение, нажав кнопку, которая открывает модальное окно:

<a class="um-menu-label" ng-click="renameDiscountTable()">Rename              </a>

как только пользователь обновил значение и нажал «ОК», я называю это:

modalInstance.result.then(function (data) {

                        if ($scope.selectedDiscountTable.id != data.name) {
                            if ($scope.selectedDiscountTable.isFromServer === true) {
                                //check if it was already renamed
                                var obj = _.find($scope.renamedDiscountTables, {newName: $scope.selectedDiscountTable.id});
                                if (obj) {
                                    obj.newName = data.name;
                                }
                                else {
                                    $scope.renamedDiscountTables.push({
                                        oldName: $scope.selectedDiscountTable.id,
                                        newName: data.name
                                    });
                                }
                            }
                            $scope.selectedDiscountTable.id = data.name;
                          //THIS IS WHERE I CHANGE THE TYPEAHEAD MODEL VALUE    
                            $scope.selectDiscountTable($scope.selectedDiscountTable);
                        }


                }


 $scope.selectDiscountTable = function (discount) {
            $scope.selectedDiscountTable = discount;
            $scope.selectedTypeaheadValue = angular.copy($scope.selectedDiscountTable);
        };

Проблема в том, что модель ($scope.selectedTypeaheadValue) обновляется, но значение, отображаемое пользователю, остается прежним, поэтому, если я переименовал Discount1 в Discount2, модель обновится, но пользователь все равно увидит скидку1:

![введите описание изображения здесь


person Tomer    schedule 31.08.2015    source источник


Ответы (2)


Скорее всего, ваш $scope.selectDiscountTable может быть вызван вне цикла дайджеста, так как он запускается внутри отложенной функции. Поскольку это не угловое событие, вам, вероятно, придется инициировать повторный обзор вручную, чтобы синхронизировать представление.

Попробуйте использовать $scope.$evalAsync() и обновите значения $scope внутри него.

person Hysterix    schedule 31.08.2015
comment
Не уверен, что это правда, так как это модальный интерфейс ui-bootstrap, и он работает внутри цикла angular. Вы можете видеть, что я также обновляю другие значения $scope, и они обновляются очень хорошо. - person Tomer; 31.08.2015

По-видимому, это простое решение, все, что мне нужно было сделать, это изменить ng-модель в html с: ng-model="selectedTypeaheadValue" на: ng-model="selectedTypeaheadValue.id"

person Tomer    schedule 01.09.2015