Обновить значение области после динамического обновления текстового поля

в AngularJS у меня есть сценарий, когда пользователь выбирает значение из сетки во всплывающем окне, и выбранное значение отображается в текстовом поле на странице контейнера. После того, как пользователь выбирает значение, всплывающее окно вызывает событие, которое фиксируется на странице контейнера. Теперь я могу установить значение текстового поля с помощью .val(), но как мне обновить модель?

$scope.$on('rowSelectedInPopup', function (event: ng.IAngularEvent, ...data) {
    if (elementId === data[1].toString()) {
        $(elementId).val(data[0].toString());
        $(elementId + "_inlinelbl").html(data[0].toString());
    }
});

Вот мое текстовое поле и метка html:

<input type="text" value="" id="ServiceManagerglookup" ng-model="Model.Person2.Name" />
<label id="ServiceManagerglookup_inlinelbl" ng-model="Model.Person2.Name">ABC</label>

Обратите внимание, что текстовое поле может быть связано с любым произвольным полем в области видимости, например. Модель.AVC.XYZ.LMN


person Haris    schedule 08.07.2014    source источник
comment
Извините, если я неправильно понял, но; Помните, что двусторонняя привязка является одной из ключевых функций Angular — вместо изменения представления вы должны просто изменить модель, и данные будут обновлены автоматически. Итак, через ваш контроллер просто установите $scope.Model.Person2.Name = html(data[0].toString()). Когда вы это сделаете, элемент ввода с ng-model="Model.Person2.Name" будет просто обновлен.   -  person Nicklas Kevin Frank    schedule 08.07.2014
comment
Привет, спасибо за ответ. Проблема в том, что Model.Person2.Name также является динамическим, поскольку элемент управления можно использовать в разных местах и ​​привязывать к разным полям. Поэтому мне нужно сделать что-то вроде scope[Model][Person2][Name], которая может меняться с каждым экраном. Поэтому я думаю, что правильный вопрос заключается в том, как я могу обновить значение в области видимости, если у меня есть строка типа Model.Person2.Name или Model.ABC.XYZ.PQR.   -  person Haris    schedule 08.07.2014
comment
Понятно - я не могу придумать никакого другого решения, кроме простого разделения указанной строки; var array = string.split('.') а потом делать $scope.array[0].array[1].array[2].array[3] = html(data[0].toString()) Не совсем хорошее решение, но тем не менее решение   -  person Nicklas Kevin Frank    schedule 08.07.2014
comment
это исправит только один случай. что, если строка Model.ABC, тогда мне понадобится $scope.array[0].array[1]   -  person Haris    schedule 08.07.2014


Ответы (1)


Помимо изменения значения, вам также необходимо сообщить Angular, что значение изменилось с помощью

$(elementId).trigger('input');

Как это

$scope.$on('rowSelectedInPopup', function (event: ng.IAngularEvent, ...data) {
    if (elementId === data[1].toString()) {
        $(elementId).val(data[0].toString());
        $(elementId + "_inlinelbl").html(data[0].toString());
        $(elementId).trigger('input');
    }
});

Запуск этого входного прослушивателя обычно выполняется браузером, поэтому, когда вы напрямую меняете модель, вы вынуждены также запускать событие.

person Nicklas Kevin Frank    schedule 08.07.2014
comment
привет, это работало для текстовых полей, но я пробовал то же самое со скрытым полем, но это не сработало. Таким образом, требование такое же, но со скрытым полем. Также что является вводом в .trigger('input')? Я читал, что мы должны указать имя события для запуска, а ввод не является именем события. - person Haris; 09.07.2014
comment
.trigger('input') — это имя события. Для скрытого поля вы можете попробовать $(elementId).triggerHandler("change"); - person Nicklas Kevin Frank; 09.07.2014
comment
да пробовал, но значение в области видимости не обновлялось. пробовал так: angular.element(hdnElement.selector).triggerHandler('change'); также hdnElement.trigger('change'); - person Haris; 09.07.2014