#javascript #html #angularjs
#javascript #HTML #angularjs
Вопрос:
Я хочу сбросить $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;
}
Комментарии:
1. что
console.log('array', $scope.event);
выводит?2. Почему бы вам не поместить a
console.log(limit ' | ' $scope.dynamic)
внутри safelyAdd и посмотреть, каковы значения.3.
$scope.event
значение печатного массива объекта, который следует сбросить, если он достигаетlimit
4. Зачем управлять размером массива с помощью
$scope.dynamic
? вы должны проверить размер массива через$scope.event.length
. Вероятно, у вас глобальная проблема с областью видимости, но мы можем видеть это, поскольку вы не включили свой изменяющийся код$scope.dynamic
5. итак, идея состоит в том, чтобы очистить старые данные в массиве, как только они достигнут определенного предела, потому что это создавало проблемы с производительностью и замораживало экран. мы получаем 5000 сообщений за одну минуту, поэтому мы хотим иметь размер строки в байтах, и когда
$scope.event
размер байта объекта массива достигаетlimit
, он должен сбросить$scope.event
.
Ответ №1:
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;
}
Комментарии:
1. но проблема в том, что после сброса массив
$scope.dynamic
всегда будет больше, и он никогда не будет соответствовать условию.2. @как
$scope.dynamic
вычисляется?3.
$scope.dynamic
является ли значение, поступающее от другой функции, которая преобразует строку в байты, и оно будет последовательно меняться и суммироваться при каждом получении нового сообщения, так что в основном это сумма байтов от общего количества сообщений, полученных на данный момент..4. @хуссейн, тебе, наверное, нужно сравнить вот так
if ($scope.dynamic > limit) { $scope.event = []; $scope.dynamic = 0; }
5. но мне также нужно
$scope.dynamic
значение, чтобы сохранить сумму для другого сценария, если мы установим$scope.dynamic
значение 0, это нарушит какую-то другую логику, есть ли способ, которым мы можем сбросить$scope.dynamic
только при проверке предела?
Ответ №2:
Теперь, когда вы обновили свой код, я понимаю, что $scope.dynamic и totalLength должны содержать текущий размер в байтах массива $scope.event (не более 5000 байт), а не длину массива, как я думал ранее. Похоже, у вас много переменных, находящихся в глобальной области видимости, которые могут быть перезаписаны в другом месте приложения, так что это возможно. Можете ли вы опубликовать часть своей консоли.операторы журнала? Помимо этого, вы пытались добавить .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));
Комментарии:
1.
$scope.dyamic
значение равно сумме и будет меняться каждый раз, когда мы получаем сообщение.