我有以下服务为我成功连接到php文件并从数据库中获取数据:
(function(){
'use strict';
angular.module('app.services')
.factory('myService', [ 'getContent', function(getContent, $resource, $scope) {
return {
//list of things returned by this service:
getEventTypes: function(dir, file) {
var getAllTypes = getContent.getphp(dir, file);
getAllTypes.query(function(data){
$scope.mytypes = data;
});
}
};
}])
;
})();
但我无法通过它为任何变量分配数据。事实上,$ scope.mytypes给了我一个“无法设置未定义的属性'etypes”......我不确定发生了什么?如果我删除$ resource和$ scope然后它不起作用,因为我将另一个服务注入此服务...... Blegh。建议?
答案 0 :(得分:1)
不要在服务中使用$ scope,这是不可取的。
由于Angulajs是一个MVC框架,M模型之间应该绑定 V-view和C-controller这里的$ scope是模型 - 将视图连接到控制器的实体。
因此,我们不应该在服务中使用它,并且不会按预期工作。
我们通常每个视图使用一个控制器,如果我们有任何通用逻辑应该在多个控制器中重用,如通用验证,API调用等,它应该在服务中使用。这就是为什么Service被构建为单例对象的原因,这意味着只有一个实例将在SPA(单页面应用程序)中创建并在多个控制器之间共享。但是应该为每个视图创建唯一的控制器和$ scope。
希望你明白这一点。因此,您的上述服务可以修改如下,以返回API调用的承诺,您可以在控制器内部使用相同的调用并将对象分配给$ scope。
<强>服务强>
return {
//list of things returned by this service:
getEventTypes: function(dir, file) {
var getAllTypes = getContent.getphp(dir, file);
return getAllTypes;
}
};
<强>控制器强>
myService.getEventTypes(/* params */).query(function(data) { $scope.myTypes = data; });
答案 1 :(得分:1)
这是另一种方法,您可以让服务为您完成所有工作,减少控制器中的代码行。
(function(){
'use strict';
angular.module('app.services')
.factory('myService', [ 'getContent', function(getContent, $resource, $scope) {
return {
//list of things returned by this service:
getEventTypes: function(dir, file,successcallback) {
getContent.getphp(dir, file)
.query()
.success(function (data, status, headers, config) {
successcallback(data);
})
.error(function (data, status, headers, config) {
$log.warn(data, status, headers, config);
})
}
};
}]);
})();
分配到范围对象将是这样的
myService.getEventTypes(/*you params comma separate if needed*/,function(successcall){
$scope.data=successcall;
});