Исходные данные JS-кода.
Атрибут.
"ArticleName": { "dataValueType": this.Terrasoft.DataValueType.TEXT, "type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN, "value": "" },
Метод получения значения атрибута
getArticleName: function() { var articleName = this.get("ArticleName"); return articleName ? articleName : ""; },
Метод кнопки
onGetArticleNameClick: function () { // Первый запуск - <пусто> // Последующие запуски - <наименование> this.showInformationDialog(this.getArticleName()); this.set("ArticleName", ""); // Данные реестра. var gridData = this.getGridData(); if (gridData) { var activeRow = this.getActiveRow(); if (activeRow) { // Поле Id. var activeRowId = activeRow.get("Id"); if (activeRowId) { var serviceData = { id: activeRowId }; ServiceHelper.callService("VSKBSourceCodeServices", "GetArticleName", function (response) { var result = response.GetArticleNameResult; this.set("ArticleName", result); }, serviceData, this); } } } // Всегда <пусто> this.showInformationDialog(this.getArticleName()); },
Не могу понять, почему ServiceHelper.callService не заполняет значение атрибута ArticleName сразу? Ощущение, как будто вызов клиентского веб-сервиса GetArticleName выполняется асинхронно.
Нравится
Здравствуйте! Данная проблема связана из-за асинхронности js ф-ция обратного вызова запускается в другом потоке и контекст this - уже не виден. Вам нужно до вызова ServiceHelper объявить переменную, например scope и записать в нее this:
var scope = this;
а в ф-ции обратного вызова уже писать:
scope .set("ArticleName", result);
Как то так, должно стработать.
Здравствуйте! Данная проблема связана из-за асинхронности js ф-ция обратного вызова запускается в другом потоке и контекст this - уже не виден. Вам нужно до вызова ServiceHelper объявить переменную, например scope и записать в нее this:
var scope = this;
а в ф-ции обратного вызова уже писать:
scope .set("ArticleName", result);
Как то так, должно стработать.
Нигрескул Алексей,
Спасибо за ответ, внутри функции обратного вызова удалось задать значение атрибута.
Но, проблема в том, что мне нужно дождаться выполнения
ServiceHelper.callService, и затем выполнить обращение к этому атрибуту.
Дамиан, так это вызов из браузера отдельного сервиса на серверной стороне, он может выполняться как угодно долго. Для этого и предусмотрена функция, запускаемая при получении ответа.