2016-10-14 2 views
1

Я хочу сбросить $scope.event до [], если limit больше $scope.dynamic, поэтому ниже код не имеет значения $scope.event Любая идея, где я принимаю к сведению ошибку?как сбросить значение массива, когда динамическое значение достигает предела?

main.html

<ul style="list-style: none;"> 
    <li ng-repeat="message in event track by $index | limitTo:500" ng-class="{lastItem: $last}"><span><strong>Log:</strong></span><span>{{message}}</span></li> 
</ul> 

ctrl.js

var limit = 5000; 
$scope.event = []; 
var totalLimit; 
$scope.dynamic = this numeric value is changing based on data; 
socket.on('ditConsumer', function(data) { 
    var obj = { 
     file: $scope.filename, 
     data: data 
    } 
    getByteLen(data); 
    safelyAdd({ 
     id: $scope.event.length, 
     value: data 
    }); 

}); 

function safelyAdd(element) { 
    if (totalLimit > limit) { 
     $scope.event = []; //reset array if max size reached.. 
    } 
    $scope.event.push(element); //then push new item.. 
    console.log('array', $scope.event); 
    console.log('totalLimit', totalLimit); 
} 

получение $scope.dynamic значение в этих функций ...

$scope.random = function(value) { 
     $scope.dynamic = value; 
     totalLimit = value; 
     $scope.downloadPercentage = parseFloat((value/$scope.maxBytes) * 100).toFixed(0); 
     console.log('current value-dynamic',$scope.dynamic); 
    }; 
    function getByteLen(normal_val) { 
     // Force string type 
     normal_val = String(normal_val); 

     var byteLen = 0; 
     for (var i = 0; i < normal_val.length; i++) { 
      var c = normal_val.charCodeAt(i); 
      byteLen += c < (1 << 7) ? 1 : 
       c < (1 << 11) ? 2 : 
        c < (1 << 16) ? 3 : 
         c < (1 << 21) ? 4 : 
          c < (1 << 26) ? 5 : 
           c < (1 << 31) ? 6 : Number.NaN; 
     } 
     currentBytesSum = currentFileBytes.reduce(function(a, b) { return a + b; }, 0); 
     $scope.random(currentBytesSum); 
     formatBytes(currentBytesSum); 
     return byteLen; 
    } 
    function formatBytes(bytes,decimals) { 
     if(bytes == 0) return '0 Byte'; 
     var k = 1000; 
     var dm = decimals + 1 || 3; 
     var sizes = ['Bytes', 'KB', 'MB']; 
     var i = Math.floor(Math.log(bytes)/Math.log(k)); 
     var data = parseFloat((bytes/Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; 
     console.log('sum of all the bytes', data); 
     $scope.currentBytes = data; 
    } 
+0

Что делает 'console.log ('array', $ scope.event);' output? –

+0

Почему бы вам не поставить 'console.log (limit + '|' + $ scope.dynamic)' внутри safelyAdd и посмотреть, что это за значения. – Zach

+0

'$ scope.event' значение напечатанный массив объекта, который должен быть сброшен, если он достигает' limit' – hussain

ответ

2
var limit = 5000; 
$scope.dynamic = 0; 
var totalReceived = 0; 

socket.on('ditConsumer', function (data) { 
    var byteLength = getByteLen(data); 
    $scope.dynamic += byteLength; 
    totalReceived += byteLength; 

    $scope.$apply(function() { 
     safelyAdd({ 
      id: $scope.event.length, 
      value: data 
     }); 
    }); 

}); 

function safelyAdd(element) { 
    if (received > limit) { 
     $scope.event = []; //reset array if max size reached.. 
     $scope.dynamic = 0; 
    } 
    $scope.event.push(element); //then push new item.. 
    console.log('array', $scope.event); 
    console.log('totalLimit', totalLimit); 
} 

$scope.random = function (value) { 
    $scope.downloadPercentage = parseFloat((value/$scope.maxBytes) * 100).toFixed(0); 
    console.log('current value-dynamic', $scope.dynamic); 
}; 
function getByteLen(normal_val) { 
    // Force string type 
    normal_val = String(normal_val); 

    var byteLen = 0; 
    for (var i = 0; i < normal_val.length; i++) { 
     var c = normal_val.charCodeAt(i); 
     byteLen += c < (1 << 7) ? 1 : 
       c < (1 << 11) ? 2 : 
         c < (1 << 16) ? 3 : 
           c < (1 << 21) ? 4 : 
             c < (1 << 26) ? 5 : 
               c < (1 << 31) ? 6 : Number.NaN; 
    } 
    currentBytesSum = currentFileBytes.reduce(function (a, b) { 
     return a + b; 
    }, 0); 
    formatBytes(currentBytesSum); 
    return byteLen; 
} 

function formatBytes(bytes, decimals) { 
    if (bytes == 0) return '0 Byte'; 
    var k = 1000; 
    var dm = decimals + 1 || 3; 
    var sizes = ['Bytes', 'KB', 'MB']; 
    var i = Math.floor(Math.log(bytes)/Math.log(k)); 
    var data = parseFloat((bytes/Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; 
    console.log('sum of all the bytes', data); 
    $scope.currentBytes = data; 
} 
+0

, но проблема заключается в том, что после реселлера массив '$ scope.dynamic' будет всегда больше, и он никогда не встретит условие. – hussain

+0

@how рассчитывается '$ scope.dynamic'? –

+0

'$ scope.dynamic' - это значение, исходящее из другой функции, которая преобразует строку в байты, и она будет постоянно меняться и добавляет каждое новое полученное сообщение, поэтому в основном это сумма байтов, получаемых до сих пор. – hussain

1

Теперь, когда вы обновили свой код, Теперь я понимаю, что $ scope.dyna mic и totalLength оба должны содержать текущий размер в байтах массива $ scope.event (не более 5000 байт), а не длину массива, как я думал ранее. Похоже, что у вас много переменных, живущих в глобальном масштабе, которые могут быть перезаписаны в другом месте приложения, так что это возможно. Можете ли вы опубликовать некоторые ваши инструкции console.log? Помимо этого, вы пытались добавить .bind (this) к обратному вызову ditConsumer?

socket.on('ditConsumer', function(data) { 
    var obj = { 
     file: $scope.filename, 
     data: data 
    } 
    getByteLen(data); 
    safelyAdd({ 
     id: $scope.event.length, 
     value: data 
    }); 

}.bind(this)); 
+0

Значение $ scope.dyamic' является суммой и будет меняться каждый раз, когда мы получаем сообщение. – hussain

Смежные вопросы