9

我尝试使用指令和 spin.js(不使用 jQuery)用 AngularJS 编写加载程序。

我知道 AngularJS 有自己的 jQuery lite。但是我无法widthelementin 指令中获取。

基本上我需要获取按钮宽度(内部指令)

到目前为止我尝试过:

element[0].width  // < - error
angular.element(element[0]).css('width')  // < - undefined

开始了:

演示Plunker

HTML

 <button type="submit" loader left="5" ng-click="loadData()" >Load Data</button>

JS

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope, stockData, $timeout) {


  $scope.loadData = function(){

    $scope.init();

            stockData.query()
                        .then(function (result) {
                        $timeout(function () {
                            $scope.data = result.data;

                            $scope.stop();
                            return result.data;
                        }, 3000);
                    }, function (result) {
                        alert("Error: No data returned");
                    });   
               }
      });


app.directive('loader', ['$parse',  'stockData', '$timeout', function ($parse, stockData, $timeout) {

    return {
        restrict: 'A',
        link: function (scope, element, attr) {

            var spinner;

             var opts = {
                lines: 13, // The number of lines to draw
                length: 3, // The length of each line
                width: 2, // The line thickness
                radius: 7, // The radius of the inner circle
                corners: 1, // Corner roundness (0..1)
                rotate: 0, // The rotation offset
                direction: 1, // 1: clockwise, -1: counterclockwise
                color: '#000', // #rgb or #rrggbb or array of colors
                speed: 1.3, // Rounds per second
                trail: 60, // Afterglow percentage
                shadow: false, // Whether to render a shadow
                hwaccel: false, // Whether to use hardware acceleration
                className: 'spinner', // The CSS class to assign to the spinner
                zIndex: 2e9, // The z-index (defaults to 2000000000)
                top: 'auto', // Top position relative to parent in px
                left: 'auto' // Left position relative to parent in px
            };


               target = element[0];

              scope.init = function(){
               attr.$set('disabled', true);


             if(attr['left'] != undefined){

               var left_ = parseInt(attr['left']);

             console.log(element[0].width); // < - error
             console.log(angular.element(element[0]).css('width')); // < - undefined


               if(left_ >= 0){
                 //opts.left = element.width() + parseInt(attr['left']);
               }
               else{
                // opts.left =  -element.width()/2  + parseInt(attr['left']);
               }
             }  

               spinner = new Spinner(opts).spin(target);
            }; 

            scope.stop =  function(){
              attr.$set('disabled', false);
              spinner.stop();
            };
        }
    };
}]);


app.factory('stockData', ['$http', '$q', function ($http, $q) {

    var factory = {
        query: function () {
             // dummy call
            var data = $http.get('http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22YHOO%22)%0A%09%09&env=http%3A%2F%2Fdatatables.org%2Falltables.env&format=json');
            var deferred = $q.defer();
            deferred.resolve(data);
            return deferred.promise;
        }

    }
    return factory;
}]);

谢谢,

4

3 回答 3

20

利用element[0].offsetWidth

.css('width')将是未定义的,因为您没有任何定义宽度的内联.widthCSS,并且是 jQuery 的东西。

angular.element如果 jQuery 不可用,则使用“jqLit​​e”,它只提供功能的子集。计算的 CSS 样式不是其中之一(由于性能影响,不会很快出现)。

这里有一个不错的参考资料,说明你可以在没有 jQuery 的情况下做什么

于 2013-11-04T09:37:23.627 回答
6

element[0].getBoundingClientRect()是另一个强大的 API。

您可以通过调用获得bottom, height, left, right, top, :width

element[0].getBoundingClientRect()
于 2014-04-23T22:34:22.240 回答
2

对于那些对检索任意 CSS 属性感兴趣的人,您可以通过以下方式在指令的链接函数中访问 Angular 元素的 CSS 样式

var style = window.getComputedStyle(element[0]),

然后访问任何 CSS 规则的值,如下所示:

var color = style.getPropertyValue('color');
于 2017-01-04T21:46:30.830 回答