Исходные данные 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 выполняется асинхронно.

Нравится

3 комментария
Лучший ответ

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

Дамиан, так это вызов из браузера отдельного сервиса на серверной стороне, он может выполняться как угодно долго. Для этого и предусмотрена функция, запускаемая при получении ответа.

Показать все комментарии

Добрый день коллеги.

Столкнулся со странной ситуацией. Обратился к ТС, но все же решил и тут задать свой вопрос:

При реализации очередной кастомизации необходимо было выполнить запрос EntitySchemaQuery:

    

    var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager.GetInstanceByName("ServiceEngineer"));

    var colId = esq.AddColumn(esq.CreateAggregationFunction(AggregationTypeStrict.Count, "Id"));

    var esqFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "ServiceItem", serviseId);

    esq.Filters.Add(esqFilter);

    result = esq.GetSelectQuery(UserConnection).GetSqlText();

    return result;

Реализовывал с использованием ServiceHelper, где для анализа данных реализовал два метода: GET и POST.

Странность заключается в том, что исходный код у данных методов одинаков, а результат разный (см. аттач GET.png и POST.png)

Изображение удалено.

Изображение удалено.

Нравится

1 комментарий

Вероятно, дело не в GET и POST, а в том, что второй раз запускается под пользователем, у которого нет прав на таблицу ServiceEngineer. См. тут или тут.

Показать все комментарии

Добрый день всем.

При попытке обращения к сервису через Js возникает 500 ошибка.

Пример объявления метода Сервиса:

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "Upload", BodyStyle = WebMessageBodyStyle.Wrapped,
RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
   public string Upload(Stream fileContent, string fileName, string fileDestination) {

 

Пример вызова из Js:

var file = files[0];
    var reader = new FileReader();
    reader.readAsBinaryString(file);
    reader.addEventListener("load",
         function(item) {
	 var data = {
       	      fileContent: item.target.result,
	      fileName: file.name,
	      fileDestination: destinationPath
	 };
	 ServiceHelper.callService("KmFileUploadService",
	      "Upload",
     	      function(response) {
	           this.console.log(response);
	      },
	      data,
	      this
	 );
	 }.bind(this),
    false);

Кто знает, в чём конкретно может быть проблема? При попытках вызова сервиса (когда у метода всего 1 параметр) не возникает никаких проблем.

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

Нравится

3 комментария

Максим Шевченко пишет:

https://stackoverflow.com/questions/7999634/parsing-a-stream-and-a-para

 Хм, повторюсь. Я брал пример с исходников. Если там всё работает исправно то и в моем случае должно отрабатывать как часы. Тип роли не играет. Хоть 3 стринга там указать всё равно будет 500 ошибка.

Кисловский Михаил Андреевич,

ну, вот в данном случае как раз играет, поскольку в итоге получается WCF сервис, который имеет несколько другие нотации... тут Вам либо получать сырой поток данных и потом самому парсить, либо использовать какие-то простые типы данных для передачи в сервис... например, кодировать контент файла в BASE64 и вставлять в качестве параметра как string...

Показать все комментарии