我在AngularJs中使用工厂函数获取数组。这是控制台
Array[0]
0: "value1"
1: "value2"
length:2
但是当我想得到数组的长度时
console.log(array.length)
从环回中的mysql获取数据
app.factory("getFoo", function(Communications){
return {
getCommi: function(val,id){
var array = [];
var myVals = Communications.find({
filter: {
where: {
and : [{
communications_type_code : val
},{
object_id : id
}]
}
}
}, function(data){
for(var i=0; i< data.length; i++){
array[i] = data[i].contact_value;
}
return array;
});
return array;
}
}
});
控制器看起来像:
app.controller('usersFormCtrl', ['$scope','getFoo',function($scope,getFoo){
var emails = getFoo.getCommi(3,1);
setTimeout(function(){
$scope.formModel.emails = [];
for(var index=0; index < $scope.emails.length; index++){
$scope.emails = emails;
}
}, 0)
}])
我知道长度为0.为什么?
答案 0 :(得分:1)
这是一个时间问题。第一次询问长度时确实为0,但是几秒钟后使用Chrome开发工具检查对象时,您正在检查现在已经填充的活动对象。
您可以使用setTimeout
setTimeout(function(){
console.log(array);
}, 0)
您可以查看此link以获取进一步说明
<强>更新强>
在角度中,使用$timeout
代替setTimeout
。像这样:
$timeout(function(){
console.log(array);
}, 0)
答案 1 :(得分:0)
JavaScript中Array的length属性是不可变的。您可以通过定义其中的属性数量来设置数组的大小:var a = new Array(2),或者只传入您的值:var a = ['value1','value2']。
答案 2 :(得分:0)
您可以在此处将异步与同步方法混合使用。
Communications.find
是异步的,但您可以在getCommi
中使用它,例如同步功能。
当您致电getCommi
时,该功能会立即返回空array
。
请按以下方式更改。
app.factory("getFoo", function(Communications){
return {
getCommi: function(val,id, cb){
var array = [];
var myVals = Communications.find({
filter: {
where: {
and : [{
communications_type_code : val
},{
object_id : id
}]
}
}
}, function(data){
for(var i=0; i< data.length; i++){
array[i] = data[i].contact_value;
}
cb(null, array);
});
}
}
});
和
app.controller('usersFormCtrl', ['$scope','getFoo',function($scope,getFoo){
getFoo.getCommi(3,1, function(err, emails){
$scope.formModel.emails = [];
for(var index=0; index < $scope.emails.length; index++){
$scope.emails = emails;
}
});
}])
免责声明:我不知道有角度。
答案 3 :(得分:-1)
试试这个,
console.log(array[0].length)