2015-10-29 20 views
20

Bir sayfada iki Bootstrap sekmesi var ve her sekmede bir liste görüntülenir. Ben her liste öğesi bir kare olmak istiyorum ve bunun Bootstrap kontrollü dinamik genişliğine eşit olacak şekilde her liste öğesinin yüksekliğini ayarlamak için bu angularjs direktifini yazdı: Ben bu sayfayı ilk sekmenin liste öğeleri yüklemekBu genişlik AngularJS yönergesini izlemeyi neden Bootstrap sekmelerini değiştirerek çalışmıyor?

app.directive('squareDiv', function() { 
    return { 
     restrict: "A", 
     link: function (scope, element,attr) { 
      scope.getWidth = function() { 
       return element.width(); 
      }; 
      scope.$watch(scope.getWidth, function (width) { 
       element.css({ 
        height: width + 'px' 
       }); 
      }, true); 
     } 
    }; 
}); 

Direktifin çalıştığı anlamına gelen kareler olarak görün. Ama başka bir sekmeyi tıkladığımda, liste öğeleri varsayılan 100 px yüksekliğe sahip. İlk sekmeye geri döndüğümde, liste öğeleri bile şimdi varsayılan yüksekliğe sahip.

Burada yanlış olan ne oluyor?

GÜNCELLEME 1: http://plnkr.co/edit/Pc7keuRXR9R3U6AhZmFE?p=preview

GÜNCELLEME 2: UI-Bootstrap yerini Bootstrap ile

Plunker hala aynı sorun var Burada

bu sorunu gösteren bir plunker link: sekme anahtarı yerine ilişkin bir saatle

Plunker: http://plnkr.co/edit/rLE1wUAHKzJP6FVnGF6b?p=preview

GÜNCELLEME 3 genişlik değişiminin orijinal çözümü için geçici çözüm (doğru saatin düzgün çalışmadığı; pencere yeniden boyutlandırma nedeniyle genişlik değişikliklerine uyum sağlamak için ayrı bir yönerge kullanması gerekecektir): http://plnkr.co/edit/Y4Goe0cexq979JsIcBxl?p=preview

Genişlik saatinin neden sekme anahtarından sonra düzgün çalışmayı durdurduğunu anlamak isterim.

+2

sekme gizli olduğu için olabilir olduğunu. Her neyse, bir plunker falan yaparsan yardımcı olur. –

+1

Bu doğru, bir plunker büyük yardım olabilir! –

+0

Bu davranışı gösteren bir plunker bağlantısı aşağıdadır: http://plnkr.co/edit/Pc7keuRXR9R3U6AhZmFE?p=preview Yönergesi, sekme 1'de değil sekmede çalışır 2 – Price

cevap

8

Yönerginizin izleyicisi, neler olup bittiğinin ardında bir özet döngüdür. Yeterince yakından bakarsanız, ilk sekmenin tıklatılmasının fazla bir şey yapmadığını görürsünüz (konsolda hiçbir şey oturum açmaz). Gördüğünüz şey, etkin sekmelerinizin öğeleri gizli sekmeler öğeleri yüksekliğine yeniden boyutlandırılmasıdır. Bu yüzden gizli sekmenin yükseklikleri doğru. Genel olanı yerine bootstrap açısal sürümünü kullanmanızı şiddetle tavsiye ederim. Böylece her şey (olaylar) açısal kontrolde olacak.

https://angular-ui.github.io/bootstrap/

düzenleme: döngüsünü sindirmek anlama açısal dışında tetiklenmesi ve geri aramalar için bu belki yararlı: http://school.codecraftpro.com/courses/angularjs-1x-fundamentals/lectures/392422

edit2: ayrıca yararlı

+0

Teşekkürler! Angular'ın standart Bootstrap ile uyumlu olduğunu düşündüm. Gözlemcinin arkasında bir sindirim döngüsü olduğunu nasıl belirleyebildiniz? – Price

+1

Yığınlamada 4-4 konsol günlüğü göreceksiniz. Sekme 2'yi tıkladıktan sonra hiçbir şey yoktur. Sonra tekrar geri geliyor. Yani bu temel olarak bootstrap js tıklamasının açısal olarak kaydedilmemesidir. Bir yönerge içinde sarmak bunu çözebilir, ancak açısal kullanıcılarımız bunu zaten yapmış olduğundan, biraz zaman ayırabilirsiniz :) – dekztah

+1

düzeltme: bu döngü döngüsü içinde kayıtlı değil, ancak bir döngü sonra – dekztah

0

https://scotch.io/tutorials/how-to-correctly-use-bootstrapjs-and-angularjs-together Biliyoruz ki önyükleme sekme özetini Anahtarlama, divlarınızın genişliğinden önde. Dolayısıyla, divlarınızın genişliğinin değişmesini izlemek yerine, sekme değiştiğinde izleyelim. Sekme değiştiğinde, bir sonraki özet döngüsünde olduğumuzdan emin olmak için 1 ms bekleyelim. Ardından genişliği alın ve kutu yüksekliğini güncelleyin.

Bunun neden böyle olduğu hakkında hiçbir fikrim yok, ama işte işe yarayacak bir çözüm.içeriği henüz boyutları zorunda kalmamak İşte

, bir plunker example

JavaScript

var app = angular.module("app",['ngAnimate', 'ui.bootstrap']); 
app.controller('mainController',['$scope',function($scope){ 
    $scope.tabs = [ 
     {'title': 'Tab 1'}, 
     {'title': 'Tab 2'} 
    ]; 
}]); 

app.directive('squareDiv', function ($timeout) { 
    return { 
     restrict: "A", 
     link: function (scope, element, attr) { 

      scope.active = function() { 
       return scope.tabs.filter(function(tab){ 
        return tab.active; 
       })[0]; 
      }; 

      scope.$watch(scope.active, function (tabActive) { 
       $timeout(function() { 
        element.css({ 
         height: element.width() 
        }); 
       }, 1); 

      }); 

     } 
    } 
}); 
+0

Teşekkürler! Diğer yanıtla ilgili yorumlarda, bu çözümdeki yüksekliklerin üstesinden gelmek için sekmelerin birkaç kez değiştirilmesini önlemek için referansı ngAnimate'e kaldırmamız gerekir. – Price

+0

aslında, requestAnimationFrame öğesini $ zaman aşımına dahil ederseniz, bu, düzeni bozmayı engeller ve nganimate'i koruyabilirsiniz. bkz .: http://wilsonpage.co.uk/preventing-layout-thrashing/ – dekztah

+0

Çok ilginç! Sadece requestAnimationFrame kullanmak için plunker - http://plnkr.co/edit/UyxNI9gsOyBg6sNdcvYs?p=preview - güncellendi ve çalışıyor gibi görünüyor. Ayrıca diğer büyük sorun @ExpertSystem hangi jQuery% 100 genişliğini 100px çevirir, ne de iyi olamazdı gibi görünüyor. – jjbskir