Javascript:处理数组到对象(角度)

时间:2015-10-08 15:16:54

标签: javascript angularjs

我有以下问题:

$scope.creneaux1=creneauxFactory.list();
console.log($scope.creneaux)

给了我我的期望:

Object {}

并在对象内

creneaux : Arrays[35]
inscriptions : Arrays[554]

等。

每当我尝试使用

访问铭文数组时
console.log($scope.creneaux.inscriptions)
console.log($scope.creneaux.inscriptions[0])
console.log($scope.creneaux["inscriptions"])

我未定义。

我该怎么办?

因此使用了工厂零件:

    var creneaux ={},
  urlphp = "http://bacly.fr/baclymphp/",
  phpFiles = {
        getCreneaux: "getCreneaux.php",
        getInscriptionsclub: "getInscriptionsclub.php",
        getUsers: "getUsers.php"
    },
    countResponse=0;

function getDate(from, onSuccess, onError) {

    $http.get(urlphp + from).then(function (response) {
        if (response) {
            if (onSuccess) {
                onSuccess(response)
            }
        } else if (onError) {
            onError()
        }
    }, function () {
        onError();
    }
    )
}
getDate(phpFiles.getCreneaux, function (response) {
    creneaux.creneaux = response.data;
    countResponse++;
}, function () {
    alert("pas d acces reseau");
});
getDate(phpFiles.getInscriptionsclub, function (response) {
    creneaux.inscriptions = response.data;
    countResponse++;
}, function () {
    alert("pas d acces reseau");
});
getDate(phpFiles.getUsers, function (response) {
    creneaux.users = response.data;
    countResponse++;
}, function () {
    alert("pas d acces reseau");
});


 return {
    getResponseAfterSuccess: function (onSuccess, onError) {  

        if (Object.keys(phpFiles).length == countResponse) {
            if (onSuccess) onSuccess(tournois);
        } else {
            if (onError) onError(tournois);
        }
    },    
    list: function(){
        return creneaux;
    },
    listinsc: function(){
        return creneaux.inscriptions;
    },        
    findcreneau: function(cid){
        return _.find(creneaux.creneaux, function(t) {return t.creneau_id === cid});
    },
    findinscription: function(cid){
        return _.filter(creneaux.inscriptions, function(t) {return t.inscriptions_uid == cid});
    },

更新:我试图改进我的代码但是当我使用例如:

        $scope.selectedinscription=creneauxFactory.findinscription(window.localStorage.getItem('logmbaclyuid'));

我得到一个空数组。如何继续等待数据可用?

2 个答案:

答案 0 :(得分:1)

您需要等待,直到收到所有数据,然后触发回调。这是一种方法。

<div ng-app="myApp" ng-controller="testCtrl"> 
    <pre>
    {{selectedinscription|json}}
    </pre>
</div>
// Factory
var app = angular.module('myApp', []);
app.factory('dataFactory', function ($http) {
    var urlphp = "http://jsonplaceholder.typicode.com/",
        phpFiles = {
            getCreneaux: "posts",
            getInscriptionsclub: "albums",
            getUsers: "comments"
        },
        countResponse = 0;

    function getDate(from, onSuccess, onError) {

        $http.get(urlphp + from).then(function (response) {
            if (response) {
                if (onSuccess) {
                    onSuccess(response)
                }
            } else if (onError) {
                onError()
            }
        }, function () {
            onError();
        })
    }




    return {
        creneaux: {},
        init: function (callback) {
            var that = this;
            getDate(phpFiles.getCreneaux, function (response) {
                console.log(response);
                that.creneaux.creneaux = response.data;
                that.getResponseAfterSuccess(callback);
            }, function () {
                alert("pas d acces reseau");
            });
            getDate(phpFiles.getInscriptionsclub, function (response) {
                console.log(response);
                that.creneaux.inscriptions = response.data;
                that.getResponseAfterSuccess(callback);
            }, function () {
                alert("pas d acces reseau");
            });
            getDate(phpFiles.getUsers, function (response) {
                console.log(response);
                that.creneaux.users = response.data;
                that.getResponseAfterSuccess(callback);
            }, function () {
                alert("pas d acces reseau");
            });
        },
        getResponseAfterSuccess: function (callback) {
            if (_.keys(phpFiles).length === _.keys(this.creneaux).length) {
                callback();
            }
        },
        list: function () {
            return this.creneaux;
        },
        listinsc: function () {
            return this.creneaux.inscriptions;
        },
        findcreneau: function (cid) {
            return _.find(this.creneaux.creneaux, function (t) {
                return t.id === cid
            });
        },
        findinscription: function (cid) {
            console.log("Searching for " + cid);
            console.log(this.creneaux);
            return _.filter(this.creneaux.inscriptions, function (t) {
                return t.id == cid
            });
        }
    };
});
// Controller
app.controller('testCtrl', function ($scope, dataFactory) {
    var onSuccess = function () {
        $scope.selectedinscription = dataFactory.findinscription(1);
    };

    dataFactory.init(onSuccess);

});

这是一个有效的Fiddle。我使用通用REST API来提取数据,但你明白了。

答案 1 :(得分:0)

creneaux : Arrays[35]
inscriptions : Arrays[554]

如果这是在$ scope.creneaux中,那么输出意味着creneaux拥有另一个creneaux数组,所以你可以像这样访问它:

console.log($scope.creneaux.creneaux[0])