2013-08-19 15 views
6

Używam bootstrap w moim projekcie mvc. Mam problem z widgetem popover bootstrap. Stworzyłem niestandardowe wiążącej dla widget popover, tutaj kod nokaut:Jak zmienić rozmiar poppera na twitter bootstrap?

Check fiddle

ko.bindingHandlers.popover = { 
     init: function (element, valuesAccessor, allBindingsAccessor, viewModel, bindingContext) { 
      var options = ko.utils.unwrapObservable(valuesAccessor() || {}); 

      options.html = true; 

      options.content = '<small class="text-info">' + 'Variable text goes here.Variable text goes here.Variable text goes here.Variable text goes here.Variable text goes here. ' + '</small>'; 

      $(element).popover(options); 
     }, 
     update: function (element, valuesAccessor, allBindingsAccessor, viewModel, bindingContext) { 
      var extraOptions = allBindingsAccessor().popoverOptions; 

      $(element).popover(extraOptions.observable() ? "show" : "hide"); 
      $(element).siblings('.popover').css({ width: '150px' }); 

      //IF YOU UN-COMMENT BELOW 2 LINES THAN EVERY THINGS WORKS FINE 

      //if(extraOptions.observable()) 
       //$(element).popover('show'); 
     } 
    }; 

    function vm() { 
     var self = this; 

     self.isVisible = ko.observable(false); 

     self.open = function() { 
      self.isVisible(!self.isVisible()); 
     }; 
    } 

    ko.applyBindings(new vm()); 

chcę zainicjować popover na dowolny element o zmiennej wiadomości tekstowej oraz o zmiennej wielkości. Wszystko idzie dobrze, ale kiedy zmieniam domyślną szerokość popover niż za pierwszym razem, kiedy otwiera się jego pozycja jest nieprawidłowa (proszę sprawdzić zachowanie w skrzypcach).

W skrzypcach było trochę wierszy kodu, które usuniesz, jeśli rozwiążesz ten problem. Ale czuję, że jest to podejście hacky, chcę lepszy sposób obsługi, jeśli istnieje?

Odpowiedz

0

Zmieniasz szerokość po zainicjowaniu popover. Obliczona górna lewa pozycja popover pozostaje na miejscu, ale szerokość zmniejsza się. To powoduje, że wysokość staje się większa.

Musisz zmienić kolejność zdarzeń, aby szerokość była stosowana przed zainicjowaniem programu Popover.

+0

Zrobiłem to, ale div popover nie jest obecny przed inicjalizacją, więc zmiany nie przynoszą skutku – user1740381

+1

Próbuję zaoferować demo, ale nie jestem pewien, na czym opierasz regulację szerokości. Wydaje się to arbitralne. Dlaczego nie ustawić szerokości za pomocą CSS? – isherwood

2

DEMO

Spróbuj to ja edytowany kod

ko.bindingHandlers.popover = { 
     init: function (element, valuesAccessor, allBindingsAccessor, viewModel, bindingContext) { 
      var options = ko.utils.unwrapObservable(valuesAccessor() || {}); 



      options.html = true; 

      options.content = '<small class="text-info">' + 'Variable text goes here.Variable text goes here.Variable text goes here.Variable text goes here.Variable text goes here. ' + '</small>'; 

      $(element).popover(options); 


     }, 
     update: function (element, valuesAccessor, allBindingsAccessor, viewModel, bindingContext) { 
      var extraOptions = allBindingsAccessor().popoverOptions; 

      $(element).popover(extraOptions.observable() ? "show" : "hide"); 


      //IF YOU UN-COMMENT BELOW 2 LINES THAN EVERY THINGS WORKS FINE 

      //if(extraOptions.observable()) 
       //$(element).popover('show'); 
     } 
    }; 

    function vm() { 
     var self = this; 

     self.isVisible = ko.observable(false); 

     self.open = function() { 
      self.isVisible(!self.isVisible()); 
     }; 
    } 

    ko.applyBindings(new vm()); 

tylko dodać to CSS

.popover { 
    max-width: 150px; 
    width: auto; 
} 

nadzieję, że to pomaga Dziękuję

+0

Szerokość popover nie jest 150 Inn demo, jest domyślnie – user1740381

+0

@ user1740381 teraz jego pracy Mam edytować kod. Sprawdź to – SarathSprakash

11

Oto s wystarczająca inicjalizacja, której używam.

$(".property-price") 
    .popover({ 
      trigger: "hover", 
      placement: 'bottom', 
      toggle : "popover", 
      content : "The from price is calculated ba....the dates selected.", 
      title: "How is the from price calculated?", 
      container: 'body', 
      template: '<div class="popover popover-medium"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>', 
     }); 

Jak widać, wykorzystuje niestandardowy szablon. Szablon wykorzystuje niestandardową klasę popover-medium.

Mam następnie selektora CSS

.popover-medium { 
    max-width: 350px; 
} 

Można też po prostu ustawić styl na klasy szablonu, jeśli chciał.

+1

PS. Wszystkie odpowiedzi, jakie znalazłem, starały się tak skomplikować komplikacje tego łatwego zadania. Jest to najłatwiejsze rozwiązanie, które nie jest zhakowane. – Layke