Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组引用_Javascript_Arrays_Angularjs - Fatal编程技术网

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和处理之间存在延迟

控制台日志顺序与代码路径匹配 控制台日志条目顺序不受条目更新状态的影响。换句话说,

日志条目的顺序反映了它们被调用的顺序,而不是它们的“新鲜”