Пользовательские действия SharePoint 2010: EnabledScript и executeQueryAsync - PullRequest
0 голосов
/ 28 января 2011

У меня есть CustomAction , который добавляет кнопку на ленту. My CommandHandler указывает EnabledScript , который определяет, когда кнопка должна быть включена / отключена. Смотрите ниже:

<CommandUIHandlers>
 <CommandUIHandler
  Command="CreateSiteGroup"
  CommandAction="javascript:CreateCreateSiteGroup();" 
  EnabledScript="javascript:CreateCreateSiteGroupButtonEnabled();">
 </CommandUIHandler>
</CommandUIHandlers>

Функция CreateCreateSiteGroupButtonEnabled () просто должна возвращать true / false, однако мне пришлось использовать внутри нее функцию executeQueryAsync , чтобы я мог загрузить свойства некоторых объекты. Очевидно, поскольку теперь метод выполняется асинхронно, значение true / false никогда не возвращается.

Мой код выглядит так:

function CreateContributorsGroupButtonEnabled() {
 this.clientContext = new SP.ClientContext.get_current();
 this.web = this.clientContext.get_web();
 this.clientContext.load(this.web, "Title");
 this.clientContext.executeQueryAsync(Function.createDelegate(this, this.OnContextSucceeded), Function.createDelegate(this, this.OnQueryFailed));
}

function OnContextSucceeded() {
 this.siteGroups = web.get_siteGroups();
 this.clientContext.load(this.siteGroups);
 this.clientContext.executeQueryAsync(Function.createDelegate(this, this.OnQuerySucceeded), Function.createDelegate(this, this.OnQueryFailed));
}

function OnQuerySucceeded() {
 var contributorsGroupTitle = String.format("{0} Contributors", web.get_title());
 var siteGroupEnumerator = this.siteGroups.getEnumerator();

 while (siteGroupEnumerator.moveNext()) {
  var siteGroup = siteGroupEnumerator.get_current();

  if (siteGroup.get_title().toLowerCase() == contributorsGroupTitle.toLowerCase())
   return false;
 }

 return true;
}

Кто-нибудь знает, как я могу вернуть истину / ложь обратно из асинхронной функции? Или, альтернативно, как я могу узнать, существует ли группа сайтов с определенным именем без , используя executeQueryAsync ?

1 Ответ

2 голосов
/ 30 января 2011

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

В Core.js вы можете найти функцию RefreshCommandUI ().Эта функция вызывает обновление ленты и вызывает вызов функций EnableScript для кнопок ленты.

В коде необходимо установить переменную для отслеживания состояния (включить или отключить) кнопки.

С уважением, Анита

...