Javascript 数组引用
我试图引用数组中的一个项目,我不知道这为什么不起作用Javascript 数组引用,javascript,arrays,angularjs,Javascript,Arrays,Angularjs,我试图引用数组中的一个项目,我不知道这为什么不起作用 console.log($scope.Times); console.log($scope.Times[0]); 这两行代码正好在后面,但我从控制台得到的输出如下 你知道为什么这不起作用吗?正如我前面提到的,这些命令彼此紧跟在一起,在同一个函数中,变量在我的控制器中是全局的 我可以添加更多的代码,如果你认为它可以帮助,但我真的不明白如何 还有一些代码: $scope.Times = []; $scope.getStatus = funct
console.log($scope.Times);
console.log($scope.Times[0]);
这两行代码正好在后面,但我从控制台得到的输出如下
你知道为什么这不起作用吗?正如我前面提到的,这些命令彼此紧跟在一起,在同一个函数中,变量在我的控制器中是全局的
我可以添加更多的代码,如果你认为它可以帮助,但我真的不明白如何
还有一些代码:
$scope.Times = [];
$scope.getStatus = function(timer){
$http.post('getStatus.php', {timer : timer})
.success(function(response){
$scope.response = response;
if ($scope.response.Running === "0"){
$scope.model = { ItemNumber : $scope.response.Part };
$scope.loadTiming($scope.response.Part);
console.log($scope.Times);
console.log($scope.Times[0]);
}
});
};
$scope.loadTiming = function(itemNumber) {
$http.post('getPartTimings.php', {itemNumber : itemNumber})
.success(function(response){
$scope.selectedTiming = response;
$scope.Times.splice(0);
var i = 0;
angular.forEach($scope.selectedTiming, function(value) {
if (value !== 0)
$scope.Times.push({
"Process" : $scope.procedures[i],
"Duration" : value*60
});
i++;
});
});
};
<?php
$postData = file_get_contents("php://input");
$request = json_decode($postData);
require "conf/config.php";
mysqli_report(MYSQLI_REPORT_STRICT);
try {
$con=mysqli_connect(DBSERVER,DBUSER,DBPASS,DBNAME);
} catch (Exception $exp) {
echo "<label style='font-weight:bold; color:red'>MySQL Server Connection Failed. </label>";
exit;
}
$query = 'SELECT *,
TIME_TO_SEC(TIMEDIFF(NOW(),Timestamp))
FROM live_Timers
WHERE Timer='.$request->timer;
$result = mysqli_query($con, $query);
$data = mysqli_fetch_assoc($result);
echo JSON_ENCODE($data);
$scope.Times=[];
$scope.getStatus=函数(计时器){
$http.post('getStatus.php',{timer:timer})
.成功(功能(响应){
$scope.response=响应;
如果($scope.response.Running==“0”){
$scope.model={ItemNumber:$scope.response.Part};
$scope.loadTiming($scope.response.Part);
log($scope.Times);
console.log($scope.Times[0]);
}
});
};
$scope.loadTiming=函数(itemNumber){
$http.post('getPartTimeings.php',{itemNumber:itemNumber})
.成功(功能(响应){
$scope.selectedtimeing=响应;
$scope.Times.splice(0);
var i=0;
角度.forEach($scope.selectedTime,函数(值){
如果(值!==0)
$scope.Times.push({
“过程”:$scope.procedures[i],
“持续时间”:值*60
});
i++;
});
});
};
好的,更多的代码确实有帮助。看起来这里发生了异步逻辑。loadTiming被激发,它执行一个POST
,然后在Times数组上执行一个拼接。一个console.log可能在此POST
之前启动,另一个可能在此之后启动。没有简单的方法来判断
一种可能的修复方法是,仅在loadTiming
async进程运行时记录这些日志。从loadTiming
函数返回一个承诺,然后在承诺的then回调中记录数组
$scope.getStatus = function(timer){
$http.post('getStatus.php', {timer : timer})
.success(function(response){
$scope.response = response;
if ($scope.response.Running === "0"){
$scope.model = { ItemNumber : $scope.response.Part };
$scope.loadTiming($scope.response.Part).then(function () {
console.log($scope.Times);
console.log($scope.Times[0]);
});
}
});
};
$scope.loadTiming = function(itemNumber) {
return $http.post('getPartTimings.php', {itemNumber : itemNumber})
.success(function(response){
$scope.selectedTiming = response;
$scope.Times.splice(0);
var i = 0;
angular.forEach($scope.selectedTiming, function(value) {
if (value !== 0)
$scope.Times.push({
"Process" : $scope.procedures[i],
"Duration" : value*60
});
i++;
});
});
};
我认为您的问题是$scope参考问题
我想试试这个:
$scope.vm = {};
$scope.vm.Times = [];
添加“.”是附加到$scope时的最佳做法。这在这里描述得最好,与
从那以后,我多次遇到相关问题(AngularJS,由于其循环性质,似乎容易产生这种行为)
在您的情况下,使用JSON.stringify($scope.Times)
可能会“修复”这个问题
上下文
通常在这种情况下会发生这种情况:
- 进行异步调用或昂贵的DOM操作
- 您可以在这两次调用之间对console.log进行2次(或更多)调用
- DOM或对象的状态已更改
- 输出显示不一致(和奇怪)的结果
怎么
举个例子:
console.log(someObject);
console.log(someObject.property);
经过大量挖掘(并与Webkit开发人员交谈),我发现:
对console.log的第二次调用首先“已解决”
为什么?
在您的情况下,这就需要控制台以不同的方式处理对象和“表达式”:
在调用时解析“表达式”,而对于对象,则存储对所述对象的引用
注意,这里的表达式使用得比较松散。您可以在
更深入的分析
关于显示差异,上面发布的行为并不是控制台的唯一问题。事实上,它与控制台的工作方式有关
控制台是一个外部工具
首先,您必须认识到Console是一个外部工具,不是ECMAScript规范的一部分。不同浏览器的实现不同,不应在生产中使用。它当然不会对每个用户都起同样的作用
Console是一种非标准的外部工具,不在标准轨道上
控制台是动态的
控制台作为一个非常动态的工具。使用console,您可以进行断言(测试)、计时和配置代码、组日志条目、远程连接到服务器以及调试服务器端代码。您甚至可以在运行时更改代码本身。所以
控制台不仅仅是一个静态日志显示器。。。它的动态性是它最显著的特征之一
控制台有一点延迟
作为一个外部动态工具,Console充当附加到javascript引擎的观察者进程。
这在调试中很有用,并且可以防止控制台无意中阻止脚本的执行。一种简单而粗糙的方法是将console.log描绘成一种非阻塞异步调用。这意味着:
使用控制台,1)呼叫、2)处理和3)输出之间会有轻微延迟。
然而,调用控制台本身并不是“即时的”。事实上,它本身可能会延迟脚本执行。如果将其与复杂的DOM操作和事件混合使用,可能会导致奇怪的行为
。发生这种情况是因为DOM绘制延迟了DOM对象的更新,但是由DOM更改触发的事件仍然被触发。这意味着事件回调在DOM对象完全更新之前执行并完成,导致对DOM对象的引用无效
在observer中使用console.log会导致回调执行的短暂延迟,在大多数情况下,这足以让DOM对象首先更新。这证明console.log会延迟代码执行
但即使发生无效引用错误,console.log也始终显示有效对象。由于对象不能由代码本身更改,这证明在调用console.log和处理之间存在延迟
控制台日志顺序与代码路径匹配
控制台日志条目顺序不受条目更新状态的影响。换句话说,
日志条目的顺序反映了它们被调用的顺序,而不是它们的“新鲜”