2013-07-05 21 views
17

'un çalışması nedeniyle yenileniyor/varsayılan seçeneğe geri döndü AngularJS'de bir uygulama yapıyorum ve Firefox'u kullanırken belirli açılır menülerle ilgili sorun yaşıyorum.Firefox açılan açılır menü, Javascript - AngularJS

Seç menüsünü tıklatıp seçeneklerin üzerine geldiğimde, imlecim üzerinde gezinip, varsayılan/ilk seçeneğe gitmek için seçili seçeneği sıfırlar. Seçenek sayısı büyük olduğunda, doğru seçeneği seçmek çok zor olur.

Uygulama, ekranı her saniye güncellemek için JavaScript gerektirir ve bunun nedeni bu gibi görünüyor. Bununla birlikte, Chrome veya Safari'de bu sorunla karşılaşmam gibi görünmüyor.

Bunu Firefox için çözmenin bir yolu var mı?

Demo here.

index.html

<!DOCTYPE html> 
<html ng-app="myapp"> 
    <head> 
    <script data-require="[email protected]" data-semver="1.0.7" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script> 
    <link href="style.css" rel="stylesheet" /> 
    <script src="script.js"></script> 
    </head> 

    <body ng-controller="ctrl"> 
    <div ng-init="updatetimer()"> 
    <div>seconds: {{counter}}</div> 
    <select ng-model="something" ng-options="n.name for n in namelist"> 
     <option value="">select person</option>  
    </select> 
    </div> 
    </body> 
</html> 

script.js

O ng-seçenekleri yoluyla yaratma 'seçeneğin' elemanları gibi görünüyor
var app = angular.module('myapp', []); 

var ctrl = ['$scope', '$timeout', function($scope, $timeout) { 

    $scope.counter=0; 

    $scope.namelist = [ 
     {name: "Name1"}, {name: "Name2"}, {name: "Name3"}, {name: "Name4"}, {name: "Name5"}, 
     {name: "Name6"}, {name: "Name7"}, {name: "Name8"}, {name: "Name9"}, {name: "Name10"}, 
     {name: "Name11"}, {name: "Name12"}, {name: "Name13"}, {name: "Name14"}, 
     {name: "Name15"}, {name: "Name16"}, {name: "Name17"}, {name: "Name18"}, 
     {name: "Name19"}, {name: "Name20"}, {name: "Name21"}, {name: "Name22"}, 
     {name: "Name23"}, {name: "Name24"}, {name: "Name25"}, {name: "Name26"}, 
     {name: "Name27"}, {name: "Name28"}, {name: "Name29"}, {name: "Name30"} 
    ]; 

    $scope.updatetimer = function() { 

    var updater = function() { 
     $scope.counter++; 
     $timeout(updater, 1000); 
    } 
    updater(); 
    }; 

}]; 
+2

Zamanlayıcı, $ digest döngüsünü her saniye tetikleyecek ve her seferinde ng-options ifadesinin yeniden değerlendirilmesine neden olacaktır. Ben ilk koşuda un-bağlanmış açılan-aşağı üretmek ve ardışık $ digest döngüler yoksaymak için jQuery kullanacak kendi yönergesini oluşturmanın yanında bir şey yapamaz sanmıyorum. – Stewie

+1

@Stewie, $ digest döngülerini tetikleyen nedir? Bu işlevdeki '$ kapsamı '? Eğer öyleyse, belki de zamanlayıcı fonksiyonunu bir direktifte koyup eski moda yolunu güncellemesini sağlayın - angular.element (element) .html (sayaç) ... – rGil

+1

Katılıyorum, daha iyi bir fikir gibi geliyor. Bu durumda OP'nin ayrıca $ timeout fonksiyonunda üçüncü parametreyi ('invokeApply') yanlış olarak ayarlaması gerekecektir. – Stewie

cevap

3

bu konuya kök nedenidir.

Ben kodu o benim yaptığım ne

http://plnkr.co/edit/DLf2wvVGXRiwci6FhqQO?p=preview

seçenekler yaratma mantığı taşımaktır plunkr bakın sorun

eğer emin olmak için biraz deđiţtirdiđiniz ng-tekrar. Bu, sorunu şimdilik düzeltecek.

+0

Evet, ancak kodda hala bu $ timeout() var; bu, bir şeyler yapmanın yanlış yaklaşımı gibi görünüyor. Sorunu "düzeltebilirsiniz", ancak OP'nin işleri düzgün bir şekilde yapamayacağına (isteğe bağlı) benzediğine ve düzeltmek için daha fazla bilgi veya daha eksiksiz bir örnek kod sağladığına benziyorsunuz. $ Timeout() 'ın gerekli olduğu durumlar nadirdir ve bunun dışında muhtemelen yanlış yapıyorsunuzdur. –

2

Bazı insanlar v1.2.15 güncelleme yapın.

if (existingOption.id !== option.id) { 
    lastElement.val(existingOption.id = option.id); 
} 
-if (existingOption.element.selected !== option.selected) { 
+if (existingOption.selected !== option.selected) { 
     lastElement.prop('selected', (existingOption.selected = option.selected)); 
} 
} else { 

açısal çekirdeğine doğrudan bu yamayı ekleyin: Burada

düzeltmedir. Bu hata hala devam ediyor. V1.2.8

0

Bu, 1.0.7'den önce temel olarak 1.0.7 sürümünde düzeltilmiş bir AngularJS eski sürüm sorunu, 1.0.7'den daha eski bir şey kullanıyorsanız, o zaman konu.