Как установить значение переменной в всплывающем окне начальной загрузки, используя содержимое и setcontent?

 

   <script>
     function showData(recId,e)
        {  
      Visualforce.remoting.Manager.invokeAction('{!$RemoteAction.ControllerClass.getPopData}',

              recId,"{!record.Id}",

              function (result, event) {

              if(event.status)

              alert(result);   //Alerts correct value        

              $('.li').popover({content:result}); //Holds previous value 

              }, {buffer:false}
            );     
        }   
 </script>

Теперь проблема, с которой я сталкиваюсь, заключается в том, что если в списке отображаются 3 элемента, первый из которых я нажимаю, отображаются правильные данные, но при нажатии на любой другой элемент отображаются те же предыдущие данные, пока я не обновлю страницу и не щелкну. Однако в удаленном действии я вижу, что правильные данные извлекаются каждый раз, но на странице всегда отображается первый элемент, который я нажимаю.

Оповещение показывает правильный обновленный контент, но всплывающее окно не устанавливает то же самое в поле.

 

Я также попробовал способ ниже, который я нашел в одном из ответов, используя setcontent. Это несколько работает, но мне нужно дважды щелкнуть, чтобы получить правильный контент. При первом нажатии отображается предыдущее значение:

   $('.li').popover({    
    content: 'Loading...'    
     });
       
     $('.li').attr('data-content', res);
 var popover = $('.li').data('popover');
 popover.setContent();
 popover.$tip.addClass(popover.options.placement);

Любая идея, как я могу это исправить?

Обновлено на основе комментариев. Это почти работает, но когда я щелкаю один за другим элементом, но если я нахожусь и нахожусь на одном и том же элементе, всплывающее окно не отображается, хотя я вижу, что происходит вызов удаленного действия.

    <script>
    function showPopup(recId,e)
  {  

    var res='';

    Visualforce.remoting.Manager.invokeAction('{!$RemoteAction.ControllerClass.getData}',
        recId,"{!record.Id}",
        function (result, event) {
        if(event.status)
          res=result;
        $('.li').popover("destroy").popover({content:res, placement: "bottom", template: '<div class="popover" style="width:250px; font-size:12px"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'

                 });
        },{ buffer: false}

      );     

  }

</script>

person shukla yogesh    schedule 26.06.2018    source источник
comment
Параметр content также может быть function(), что может быть лучшим вариантом для получения динамического содержимого.   -  person fnostro    schedule 26.06.2018
comment
Я использую функцию и передаю ей параметры. Не знаю, как здесь писать вложенные функции.   -  person shukla yogesh    schedule 26.06.2018
comment
поменять местами: popover(po_options) где var po_options = { ... content: function(){ //retrieve data }, ... }   -  person fnostro    schedule 26.06.2018
comment
или получить данные в событии show.bs.popover: $('#myPopover').on('show.bs.popover', function () { // do something… })   -  person fnostro    schedule 26.06.2018
comment
Я вижу сделанные удаленные вызовы, но не могу установить контент. Я добавил скрипт в последний раздел. Не могли бы вы проверить один раз. Большое спасибо!   -  person shukla yogesh    schedule 26.06.2018


Ответы (1)


Учитывая базовое всплывающее окно для документов BS3, у вас есть:

<button type="button" class="btn btn-primary li" 
    title="Popover title" >
    Click to toggle popover
</button>

С <script>:

// Where the `html` property is true or false 
// if your returned dynamic data is 
// html or simple text respectively.

var po_options = { 
  html    : true, 
  content : function() {

               // $(this) is set to the element with the popover
               // get your_data, 

               return your_data;
            }
};

И инициализировать:

 $('.li').popover(po_options);

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

var po_options = {
  html: true,
  content: function() {
    var p1 = $(this).data("param1");
    return '<span>' + p1 + '</span>';
  }
};


$('.li').popover(po_options);
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>


<button type="button" class="btn btn-primary li" title="Popover 1" data-param1="Parameter1">
        Click to toggle popover 1
</button>
<br />
<br />
<button type="button" class="btn btn-primary li" title="Popover 2" data-param1="Parameter2">
        Click to toggle popover 2
</button>


Приложение

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

Вместо этого рассмотрите следующее:

Я предполагаю, что все ваши всплывающие кнопки помечены классом .li, поэтому инициализируйте всплывающие окна следующим образом:

 $('.li').popover(po_options);

Где po_options определяется как

var po_options = { 
  html    : true, 
  content : function() {
    var p1 = 'Loading...';

    Visualforce.remoting.Manager.invokeAction(
      '{!$RemoteAction.ControllerClass.getData}',
       recId,"{!record.Id}",
       function (result, event) {
         if(event.status) {
           p1 = result; 
         }
      });

      return p1;
    }
};

Теперь есть несколько вещей, которые следует учитывать:

  1. Если этот вызов завершится успешно, что будет в result?
  2. Является ли вызов invokeAction блокирующим или неблокирующим, то есть синхронным или асинхронным?

Пункт № 2 очень важен.

Если вызов синхронный, вы должны быть в порядке, предполагая, что result является текстом html.

Но если вызов асинхронный, вы вряд ли увидите содержимое всплывающей подсказки, потому что обработчик po_options.content, скорее всего, вернется до того, как параметр invokeAction result получит значение.

person fnostro    schedule 26.06.2018
comment
Спасибо за ваше время. Я попробовал скрипт как обновленный в вопросе (последний), но он не устанавливает никаких данных в контенте. Пожалуйста, вы можете помочь? Спасибо - person shukla yogesh; 26.06.2018
comment
Да, он работает асинхронно. Я попробовал фрагмент, но он не сделал удаленный вызов, однако я близок к моему требованию с обновленным скриптом (последним). Единственная проблема заключается в том, что в том же элементе списка, если я наведу указатель мыши назад, всплывающее окно не отображается. Снова мне приходится наводить курсор мыши и наводить курсор, а затем появляется всплывающее окно. Если я делаю на разных элементах, он работает нормально. - person shukla yogesh; 27.06.2018
comment
Это может быть просто вопрос настройки всплывающего окна, по умолчанию всплывающие подсказки отображаются при наведении курсора мыши, а всплывающие окна, основанные на том же коде, управляются щелчком мыши. но я считаю, что это настраивается. Возможно, обработайте вызов в событии popover show show.bs.popover. К вашему сведению, здесь конец дня, так что я отсутствую до завтра. - person fnostro; 27.06.2018
comment
Большое спасибо за ваше время! Попробую еще несколько вариантов. Это 03:10 утра, и я борюсь с этим плохо. - person shukla yogesh; 27.06.2018
comment
Я пробовал решения, но кажется, что var не установлен, потому что функция обратного вызова ведет себя асинхронно (если я устанавливаю какие-либо другие данные, она работает). Теперь я попытался добавить время ожидания перед созданием всплывающей подсказки, но это не сработало. единственный способ, которым это работает, является обратным решению, которое вы дали. к сожалению, это не работает с триггером: наведение. Работает только по клику. Я думаю, это из-за асинхронного удаленного действия. Поскольку при наведении курсора мыши и клике всегда есть зазор, поэтому данные будут готовы к тому времени. - person shukla yogesh; 28.06.2018
comment
затем используйте click, чтобы сделать асинхронный вызов, и в функции обратного вызова вручную покажите всплывающее окно с помощью $(elem).popover('show'), где elem — это ссылка на правильное всплывающее окно. - person fnostro; 29.06.2018
comment
Проблема в том, что ‹li› обернут тегом ‹repeat›, который создает несколько ‹li› на основе данных, возвращаемых контроллером, и если я использую show, то он показывает всплывающую подсказку для каждого элемента. Я не могу понять, как отличить каждый. - person shukla yogesh; 29.06.2018
comment
у вас должен быть способ установить id для каждого li, то есть: от id="li1" до id="liN" или установить соответствующие атрибуты data-, чтобы вы могли определить, какой li был нажат, чтобы $(elem) в моем предыдущем комментарии был единственным, уникальным li - person fnostro; 29.06.2018