2014-11-04 52 views
0

我有一個滑塊(input type="range"),它的最小值= 0,最大值= 1和步長= 0.001,在角度控制器中定義。範圍輸入的默認「step」屬性爲1,因此如果使用ng-model=...的模型I綁定到它的起始值爲0.5,則它將顯示滑塊爲1(或者如果起始值爲< 0.5,則爲0),因爲它的步驟太大了。將滑塊輸入綁定到十進制值的AngularJS問題

下面是一個JS提琴演示該問題: http://jsfiddle.net/1qhhr85x/

有沒有人有一個簡單的解決這個問題?

+0

恐怕您先生找到了一個BUG。因爲ng-model覆蓋了value屬性,所以你不能使用它,並且ng-value看起來不像它,它甚至可以處理範圍類型。 – Linial 2014-11-04 22:58:47

回答

1

該問題與瀏覽器如何處理新輸入[範圍]類型以及Angular進行模板綁定的時間有關。

在這種情況下,模板結合被附加到DOM(導致瀏覽器渲染引擎踢)後會發生

當渲染引擎啓動時,它會嘗試附加到HTML spec,該值決定如何計算最大步長,並相應地顯示滑塊。 (看看有什麼有趣的關於最小必須浮動的步驟是一個計算的浮點數)

問題是,DOM包含「step ='{{step}}'」在這一點時間(Angular還沒有開始,下一個週期),我假設渲染引擎使用默認值進行計算。

解決方案

確保模板添加到DOM前的步長值設定。您可以通過在控制器構造時設置「步長」值的值來實現此目的。 (我們並不想觸摸控制器裏面的元素,但我想不出另一種方式來設置的步驟之前它添加到DOM)

myApp.controller('CalcCtrl', function ($scope, $element) { 
    $scope.val1 = 0.4; 
    $scope.val2 = 0.74;  

    var rEl = $("input[type='range']", $element); 
    rEl.each(function (idx, el) { 
     $(el).attr("step", 0.001); 
    }); 
}); 

這裏的工作小提琴: http://jsfiddle.net/dLaLgfp8/1/