Angular $scope 在我的函数之外不可用
Angular $scope not available outside my function
Angular 和 javascript 有点新。我编写了以下控制器,使用工厂服务访问本地 JSON 文件。此代码的大部分源自(或完全采用)this post by Dan Wahlin。我无法在函数外部访问 $scope.books 变量,也无法弄清楚原因。函数里面的 console.log 给了我要找的对象,但是 returns 外面的那个没有定义。我在这里做错了什么?谢谢
app.controller('FormController', ['$scope', 'tocFactory', function ($scope, tocFactory) {
$scope.books;
getBooks();
function getBooks() {
tocFactory.getBooks().
success(function(data, status, headers, config) {
$scope.books = data;
console.log($scope.books);
}).
error(function(data, status, headers, config) {
// log error
})
}
console.log($scope.books);
}]);
因为你在做一个ajax然后执行下一行代码。这并不意味着您可以保证您的 ajax 响应已准备好执行下一行代码。
您始终可以在 $http
的成功函数中获取其响应值,该函数在 ajax 调用成功执行时调用。
阅读此处How asynchronous call works?
其实这不是范围的问题,而是时机的问题。 getBooks 函数是异步执行的,所以当您的控制台日志发生时,它很可能没有绑定到任何东西。您可以使用 interval 轻松测试它以查看这是如何发生的:
app.controller('FormController', ['$scope', 'tocFactory', function($scope, tocFactory) {
$scope.books;
getBooks();
function getBooks() {
tocFactory.getBooks()
.success(function(data, status, headers, config) {
$scope.books = data;
console.log($scope.books);
})
.error(function(data, status, headers, config) {
// log error
})
}
setInterval(function(){
console.log($scope.books);
}, 1000);
}]);
您可以使用 $q 服务来处理带有 promises 的异步代码:
app.controller('FormController', ['$scope', '$q', 'tocFactory', function ($scope, $q, tocFactory)
{
var getBooks = function()
{
var deferred = $q.defer();
tocFactory.getBooks().
success( function(data, status, headers, config)
{
$scope.books = data;
deferred.resolve();
} ).
error( function(data, status, headers, config)
{
deferred.reject();
} );
return deferred.promise;
};
getBooks().then( function(res)
{
console.log($scope.books); // success : your data
}, function(res)
{
console.log($scope.books); // error : undefined
} );
console.log($scope.books); // undefined
} ] );
我还没有测试过这段代码,但它应该可以工作并向您展示 promises 原则。
有关 $q 服务的更多信息:https://docs.angularjs.org/api/ng/service/$q
Angular 和 javascript 有点新。我编写了以下控制器,使用工厂服务访问本地 JSON 文件。此代码的大部分源自(或完全采用)this post by Dan Wahlin。我无法在函数外部访问 $scope.books 变量,也无法弄清楚原因。函数里面的 console.log 给了我要找的对象,但是 returns 外面的那个没有定义。我在这里做错了什么?谢谢
app.controller('FormController', ['$scope', 'tocFactory', function ($scope, tocFactory) {
$scope.books;
getBooks();
function getBooks() {
tocFactory.getBooks().
success(function(data, status, headers, config) {
$scope.books = data;
console.log($scope.books);
}).
error(function(data, status, headers, config) {
// log error
})
}
console.log($scope.books);
}]);
因为你在做一个ajax然后执行下一行代码。这并不意味着您可以保证您的 ajax 响应已准备好执行下一行代码。
您始终可以在 $http
的成功函数中获取其响应值,该函数在 ajax 调用成功执行时调用。
阅读此处How asynchronous call works?
其实这不是范围的问题,而是时机的问题。 getBooks 函数是异步执行的,所以当您的控制台日志发生时,它很可能没有绑定到任何东西。您可以使用 interval 轻松测试它以查看这是如何发生的:
app.controller('FormController', ['$scope', 'tocFactory', function($scope, tocFactory) {
$scope.books;
getBooks();
function getBooks() {
tocFactory.getBooks()
.success(function(data, status, headers, config) {
$scope.books = data;
console.log($scope.books);
})
.error(function(data, status, headers, config) {
// log error
})
}
setInterval(function(){
console.log($scope.books);
}, 1000);
}]);
您可以使用 $q 服务来处理带有 promises 的异步代码:
app.controller('FormController', ['$scope', '$q', 'tocFactory', function ($scope, $q, tocFactory)
{
var getBooks = function()
{
var deferred = $q.defer();
tocFactory.getBooks().
success( function(data, status, headers, config)
{
$scope.books = data;
deferred.resolve();
} ).
error( function(data, status, headers, config)
{
deferred.reject();
} );
return deferred.promise;
};
getBooks().then( function(res)
{
console.log($scope.books); // success : your data
}, function(res)
{
console.log($scope.books); // error : undefined
} );
console.log($scope.books); // undefined
} ] );
我还没有测试过这段代码,但它应该可以工作并向您展示 promises 原则。 有关 $q 服务的更多信息:https://docs.angularjs.org/api/ng/service/$q