函数中的 angularJS 访问对象属性不起作用

angularJS access object property in function not working

本文关键字:对象 属性 不起作用 访问 angularJS 函数      更新时间:2023-09-26

我的控制器中有一个函数,可以检查一天,然后根据时间将对象的isOpen属性切换为真或假。我像这样拉进了物体

$http.get('js/data.json').success(function(data) {
  $scope.locations = data;
});

这是我试图改变它的地方。(我将省略我设置的变量以节省空间)

$scope.checkStatus = function($scope) {

switch(day) {
        case 0: $scope.locations[0].isOpen = false;
                break;
        case 1: 
        case 2: 
        case 3: 
        case 4: 
        case 5: if( time >= $730am && time < $9pm ) {
                    $scope.locations[0].isOpen = true;
                } else {
                    $scope.locations[0].isOpen = false;
                };
                break;
        case 6: if( time >= $11am && time < $9pm ) {
                    $scope.locations[0].isOpen = true;
                } else {
                    $scope.locations[0].isOpen = false;
                };
                break;
        default: alert("default");
};
switch(day) {
        case 0: $scope.locations[0].isOpen = false;
                break;
        case 1: 
        case 2: 
        case 3: 
        case 4: 
        case 5: if( time >= $8am && time < $8pm ) {
                    $scope.locations[1].isOpen = true;
                } else {
                    $scope.locations[1].isOpen = false;
                };
                break;
        case 6: if( time >= $11am && time < $10pm ) {
                    $scope.locations[1].isOpen = true;
                } else {
                    $scope.locations[1].isOpen = false;
                };
                break;
        default: alert("default");
};

};

其余位置依此类推。

这给了我错误"无法读取未定义的属性'位置'"。但是,当我在 $http.get 成功函数中测试 $scope.locations[0].isOpen 时,它正确地向我显示了该属性。

所以我有两个问题:如何在 checkStatus 函数中访问该对象? 这是最好的方法吗?有没有一些我没有想到的更简单的方法?

编辑:

我通过删除 checkStatus() 函数并将 switch 语句放在 $http.get 成功函数中来使其工作。现在看起来像这样。我不确定这是否是最佳实践,但它似乎是有效的。

myApp.controller('MyController', function MyController($scope, $window, $http) {
  $http.get('js/data.json').success(function(data) {
    $scope.locations = data;
    // variables omitted to save space

   switch(day) {
        case 0: $scope.locations[0].isOpen = false;
                break;
        case 1: 
        case 2: 
        case 3: 
        case 4: 
        case 5: if( time >= $730am && time < $9pm ) {
                    $scope.locations[0].isOpen = true;
                } else {
                    $scope.locations[0].isOpen = false;
                };
                break;
        case 6: if( time >= $11am && time < $9pm ) {
                    $scope.locations[0].isOpen = true;
                } else {
                    $scope.locations[0].isOpen = false;
                };
                break;
        default: alert("default");
    }
 });

我认为你不需要这里的第二个$scope

$scope.checkStatus = function($scope) {

只需这样做:

$scope.checkStatus = function() {

这里的诀窍是,正确的$scope已经在此函数的"范围"中定义。

检查您从 http 请求中获取的数据。 您的错误说它找不到对象 is 在 $scope.location 中打开。请控制台 $scope.locations 以查看您的嵌套数组,然后修复您的代码。我看不到您的 json 文件,所以我对此无能为力,但请尝试用这个替换您的所有$scope.locations[0..1..2].isOpen = false;

$scope.locations.isOpen = false;

如果这不能解决您的问题,请复制粘贴您在控制台或 json 文件中记录的数据,以便我为您提供帮助。