Javascript 异步添加到主干模型阵列
当我的模型改变时,我使用主干来改变我的图表+依赖框架需要js。但当我通过ajax更新每个模型并将点对象推送到值数组时,就会出现问题,因为每个传感器都包含来自其他传感器的点 我有4个型号:传感器,型号定义部分:Javascript 异步添加到主干模型阵列,javascript,jquery,backbone.js,requirejs,Javascript,Jquery,Backbone.js,Requirejs,当我的模型改变时,我使用主干来改变我的图表+依赖框架需要js。但当我通过ajax更新每个模型并将点对象推送到值数组时,就会出现问题,因为每个传感器都包含来自其他传感器的点 我有4个型号:传感器,型号定义部分: define(['jquery', 'underscore', 'backbone'], function($, _, Backbone) { var Sensor = Backbone.Model.extend({ defaults: {
define(['jquery', 'underscore', 'backbone'], function($, _, Backbone) {
var Sensor = Backbone.Model.extend({
defaults: {
id: undefined,
value: undefined,
lastTime: undefined,
values: [],
}
}
我有setInterval
,在这里我运行函数updateAllSensors
,比如:
updateAllSensors: function() {
for (var sensId in this.elements.sensors) {
var element = this.elements.sensors[sensId];
this.updateSensor(element);
}
//console.log("charts");
//this.updateAllCharts();
},
updateSensor: function(sensorModel) {
var data = {};
if (!sensorModel) {
return;
}
var sensorId = sensorModel.get('id');
var sensor = $('#' + sensorId);
if (!sensor)
return;
$.ajax({
type: "GET",
url: sensorModel.getDbUrl(),
success: function(data) {
var arrayOfData = data.split(',');
var value = parseFloat(
arrayOfData[arrayOfData.length - 1]);
var sensorDiv = sensor.find(".sensorVal")[0];
sensorDiv.innerHTML = value.toFixed(1);
var now = new Date;
var lastTime = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
//if (sensorModel.get('values').length > 10) {
//sensorModel.get('values').shift();
//}
console.log(sensorModel.get('values'));
sensorModel.get('values').push({
x: lastTime,
y: value
});
sensorModel.set({
'value': value,
'lastTime': lastTime,
});
}
})
},
当我尝试更新一个传感器时,它会将新的点放入模型的值数组中,但当我查看回溯时,我发现所有传感器的值数组都是相等的,并且包含所有数组中的点。这意味着每个sensor.values数组包含来自所有传感器的所有点的集合
4个传感器上的值说明:
首次运行:
sensor1 values: 8 points (I want 1 point to sensor.values)
sensor2 values: 8 points (should be 1 point)
sensor3 values: 8 points (1 point)
sensor4 values: 8 points
在推送到阵列之前,先输入console.log
传感器2
[]
传感器1
[{"x":1396449826635,"y":17.59441566467285},{"x":1396449826635,"y":17.59441566467285}]
传感器3
[{"x":1396449826658,"y":18.09109687805176},{"x":1396449826635,"y":17.59441566467285},
{"x":1396449826635,"y":17.59441566467285},{"x":1396449826658,"y":18.09109687805176}]
传感器4
[{"x":1396449826687,"y":17.69054794311523},{"x":1396449826658,"y":18.09109687805176},
{"x":1396449826635,"y":17.59441566467285},{"x":1396449826635,"y":17.59441566467285},
{"x":1396449826658,"y":18.09109687805176},{"x":1396449826687,"y":17.69054794311523}]
第二次运行:
sensor1 values: 16 points
sensor2 values: 16 points
sensor3 values: 16 points
sensor4 values: 16 points
等等
如果你需要我提供的小提琴,只要写下评论就行了
提前感谢。当使用
默认值时,它只是在传感器的每个实例上共享相同的值
:
记住,在JavaScript中,对象是通过引用传递的,所以如果
如果包含一个对象作为默认值,它将在所有用户之间共享
实例。相反,将默认值定义为函数
您需要确保传感器的每个实例都有一个不同的数组:
var Sensor = Backbone.Model.extend({
defaults: {
id: undefined,
value: undefined,
lastTime: undefined,
values: function () {
return [];
}
}
}
请提供小提琴,看不到错误