Я делаю веб-приложение, используя angularJS 1.5. Пользователь будет взаимодействовать с веб-страницей, используя сканер штрих-кода, подключенный к сети. Само соединение осуществляется через веб-сокет, который возвращает мне сканированное значение.
Я бы хотел сделать следующее:
- Проверьте, какое поле имеет фокус на экране
- Установите значение этого поля для отсканированного штрих-кода
- Запустить событие для поля
Это код, который у меня сейчас есть:
self.scannerSocket.onmessage = function (e) {
// Get the scanned barcode from the event
var obj = JSON.parse(e.data);
var message = obj.Body.Values[0].Value;
var value = message.replace(/ +(?= )/g,'');
// Get the element which has focus on the screen
var $focusedElement = $($document[0].activeElement);
if(! $focusedElement || $focusedElement.is(":disabled")) return;
// Set the new value of the element
$focusedElement.val(value);
// Trigger the enter event on the element
$timeout(function(){
var e = jQuery.Event("keypress");
e.which = 13;
e.keyCode = 13;
$focusedElement.trigger(e);
});
};
Проблема в том, что изменение значения элемента не приводит к изменению ng-модели за этим элементом. Я думал сделать что-то вроде этого:
var model = $focusedElement.attr("ng-model");
$scope[model] = value;
Однако проблема в том, что код веб-сокета находится в службе. Так что нет $scope
. Плюс в моем приложении несколько изолированных компонентов. У каждого свой охват. Сканирование должно работать на всех полях ввода на экране.
Итак, вопрос: как я могу изменить значение ng-модели за элементом?