Исходные данные 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, и затем выполнить обращение к этому атрибуту.
Дамиан, так это вызов из браузера отдельного сервиса на серверной стороне, он может выполняться как угодно долго. Для этого и предусмотрена функция, запускаемая при получении ответа.