2017-02-19 14 views
-2

Я использую loopback для чтения списка/массива клиентов. Я сохранил массив клиентов в $ scope.customers.customerList. Когда я впервые регистрирую, массив кажется прекрасным, но когда я получаю его длину, он кажется потерянным, потому что он возвращает 0. Почему это происходит?Javascript/Loopback - array.length возвращает 0

Вот мой код:

$scope.customers = { customerList: [] }; 

    var filter = { 
      include: { 
       relation: 'orders' 
      } 
    }; 

    $scope.customers.customerList = Customers.find({filter: filter}); 
    console.log($scope.customers.customerList);   //outputs array with length 21 
    console.log($scope.customers.customerList.length); //array length is 0 

Ссылка: screenshot of the output

+0

Кажется, что 0 является допустимым значением и, конечно, возможно, учитывая ваш код, например. если фильтр выдает нулевые результаты. –

+2

Возможно, массив будет изменен после вызова 'console.log()'. Консоль Dev Tool показывает вам значение с момента его просмотра: «[* console.log() показывает измененное значение переменной до фактического изменения значения *] (https://stackoverflow.com/questions/ 11284663/консоль-лог-шоу-The-изменил значение в своем-переменной перед тем, заместитель стоимости фактически-ч) «. «Длина» не делает то же самое, потому что число, считанное из него, является неизменным. Вместо этого вы можете попробовать 'console.dir()'. –

+0

Возможный дубликат [console.log() показывает измененное значение переменной до фактического изменения значения] (http://stackoverflow.com/questions/11284663/console-log-shows-the-changed-value-of- а-переменной до того, заместитель стоимости фактически-ч) –

ответ

1

Это именно то, что Jonathan Lonowski описал. Customers.find, который создается ngResource, сначала возвращает пустой массив, и когда данные загружаются, он обновляет его. By the time the Browser console prints it or when you open it, the results are already there.

Из углового Docs:

Важно понимать, что вызов метода объекта $ ресурса немедленно возвращает пустую ссылку (объект или массив в зависимости от IsArray). Как только данные возвращаются с сервера, существующая ссылка заполняется фактическими данными.

0

Используйте метод find с функцией обратного вызова.

 $scope.customers = { customerList: [] }; 

var filter = { 
     include: { 
      relation: 'orders' 
     } 
}; 

Customers.find({filter: filter},function(customerList){ 
$scope.customers.customerList=customerList; 

    console.log($scope.customers.customerList);   //outputs array with length 21 
console.log($scope.customers.customerList.length); 
},function(error){ 

}); 
0

Метод поиска в loopback принимает обратный вызов и возвращает обещание. вы можете использовать либо.

//callback 
Customers.find({filter: filter}, function (err, customerList) { 
    $scope.customers.customerList = customerList; 
}); 

//Promise 
Customers.find({filter: filter}).then(function(customerList) { 
    //customerList is an array 
    $scope.customers.customerList = customerList; 
}); 

Вы можете видеть на своем выходе, что обещание было разрешено и дало 21 элемент. Длина была 0, потому что обещание не было разрешено в этот момент.