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

时间:2015-03-13 16:37:29

标签: javascript angularjs

我的控制器中有一个函数检查当天,然后根据它的时间,将我的对象的isOpen属性切换为true或false。我像这样拉了对象

$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");
};

};

等等其他地方。

这给了我错误&#34;无法读取属性&#39;位置&#39;未定义的。&#34;但是,当我在$ 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");
    }
 });

2 个答案:

答案 0 :(得分:0)

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

$scope.checkStatus = function($scope) {

这样做:

$scope.checkStatus = function() {

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

答案 1 :(得分:0)

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

$scope.locations.isOpen = false;

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