我是新来angulerjs。我不明白为什么这是行不通的。
type Deck = [Card]
运行此当我得到这个错误app.factory('jsonFactory',function ($http) {
var factory = {};
factory.getCustomers = function () {
return new Promise((resolve, reject) => {
$http({
method: 'GET',
url: `https://jsonplaceholder.typicode.com/todos`
}).then(function (response) {
resolve(response.data);
});
});
}
return factory;
})
app.controller('JsonController', ['$scope','jsonFactory', async function ($scope, jsonFactory) {
var data = await jsonFactory.getCustomers();
console.log(data);
$scope.customers = data;
$scope.$apply();
}]);
TypeError: Function.prototype.bind.apply(...) is not a constructor
但这很好用。这是为什么?我不能将异步功能传递给控制器吗?
答案 0 :(得分:0)
您的代码可以这样重写:
app.factory('jsonFactory',function ($http) {
var factory = {};
factory.getCustomers = function () {
return $http({
method: 'GET',
url: `https://jsonplaceholder.typicode.com/todos`
}).then(function (response) {
return response.data;
});
}
return factory;
})
首先-不需要额外的Promise
,因为$http
已经是一个承诺!
第二,无需调用$scope.$apply
。如果要在控制器启动时调用某些服务方法,则最好创建activate
函数,从语义上讲更有意义。
app.controller('JsonController', ['$scope','jsonFactory', function ($scope, jsonFactory) {
function activate() {
jsonFactory.getCustomers().then(function (data) {
$scope.customers = data;
});
}
activate();
}]);
关于何时应致电$apply
和如何致电article,这很不错。