我正在学习AngularJS,并且有以下代码(来自我经历的视频教程)。
eventsApp.controller('EventController',
function EventController($scope, eventData) {
eventData.getEvent(function(event) {
$scope.event = event;
});
我对JavaScript eventData.getEvent(function(event) { }
的这一点感到困惑我承认我的JavaScript知识并不超级,但与C#或Java函数/方法相比,JavaScript函数在这方面是如此奇怪。
我理解eventData
是我的AngularJS服务,在那上面,我有一个名为getEvent()
的方法,但不会将事件对象作为参数!这是我的AngularJS服务代码:
eventsApp.factory('eventData', function($http, $log) {
return {
getEvent: function(successcb) {
$http({ method: 'GET', url: 'data/event/1.json' }).
success(function(data, status, headers, config) {
successcb(data);
}).
error(function(data, status, headers, config) {
$log.warn(data, status, headers, config);
});
}
}
});
即使我告诉自己"忽略对象类型和类(沿着C#/ Java行思考)并将其视为一个简单的对象",然后我仍然无法到达eventData.getEvent(function(event) { }中的>事件参数来自!
有人可以澄清一下吗?
由于
答案 0 :(得分:2)
您实际上没有将event
作为参数传递,您将整个函数作为参数传递为callback
。当getEvent
到达.success
时,它会调用该函数(在服务中称为successcb
),并传递data
(其中data
实际上是event
您在控制器中看到的eventsApp.factory('eventData', function($http, $log) {
return {
getEvent: function() {
$http({ method: 'GET', url: 'data/event/1.json' }).
success(function(data, status, headers, config) {
// successcb(data);
// this is essentially what's happening, except in your controller...
// ...so, this won't actually work because you don't have $scope in this service
// but it's the same idea
successcb(data);
var successcb = function(event) {
$scope.event = event;
};
}).
error(function(data, status, headers, config) {
$log.warn(data, status, headers, config);
});
}
}
});
参数。
实际上看起来更像是这样:
{{1}}
答案 1 :(得分:1)
Javascript函数可以视为内联对象,可以作为参数传递。
例如,您可以使用以下内容(pseodo代码):
var x = function fun(){alert ('hi');};
callerFunction(x);
与
相同callerFunction(function fun(){alert ('hi');});
上面是什么是背后的概念,所有现代JS库(如jQuery)都利用它将所有回调函数作为参数包含在内。
答案 2 :(得分:0)
您的服务方法正在等待变量REFERENCE_TO_FUNCTION
。
也许这个例子会更清楚:
eventsApp.factory('eventData', function($http, $log) {
return {
getEvent: function(REFERENCE_TO_FUNCTION) {
$http({ method: 'GET', url: 'data/event/1.json' }).
success(function(data, status, headers, config) {
REFERENCE_TO_FUNCTION(data);
}).
error(function(data, status, headers, config) {
$log.warn(data, status, headers, config);
});
}
}
});