我的基本工厂看起来像这样:
mModule.factory('ajax_post', ['$http', function(_http) {
return{
init: function(jsonData){
var _promise= _http.post('src/php/data.ajax.php',
jsonData
,{
headers: {
'SOAPActions': 'http://schemas.microsoft.com/sharepoint/soap/UpdateListItems'
}
}
);
return _promise;
}
}]);
在这里,我在控制器中调用它:
ajax_post.init($scope.jsonData)
.then(function (result) {
if(result.status == 200){
$scope.isDone = true;
....
}
},
function (error) {
alert(error.message);
});
我想在这里使用$scope
用于其他目的,但似乎我只能使用父(aka $rootScope
)。我只有一个控制器。
所以这里有一些问题:
$scope
是好的做法,还是只有控制器必须使用它(因为根据MVC,我知道$scope
表示当前的View
{ {1}})。Model
,还是必须返回某些内容?return
实施到工厂/服务中(意思是:我可以将上述呼叫从控制器发送到工厂/服务中)吗?或者是创建承诺并从控制器调用它们的唯一正确方法?promise.then(..)
正文中实现上述service
逻辑?答案 0 :(得分:4)
在工厂/服务中使用$ scope是好的做法,还是只有控制器必须使用它(因为根据MVC,我知道$ scope代表当前模型的View。)
避免修改$ scope并且只做一件事对于可重用性是最好的。
我可以忽略工厂/服务中的退货,还是应该退货?
你必须返回你将使用的对象,就像你在这里一样。
我可以将promise.then(..)实现到工厂/服务中(意思是:我可以将上述调用从控制器发送到工厂/服务中)吗?或者是创建承诺并从控制器调用它们的唯一正确方法?
您可以通过您的.init
代码中的范围,但是您将指令与控制器耦合
为什么我不在控制器体中实现上述服务逻辑?
控制器不应该知道如何查询microsoft DB。控制器的作用是“准备数据”,而不是获取它们。
我可以编写几种在一个服务中相互调用的方法吗?
会怎么做?
答案 1 :(得分:2)
从我看到你想要使用q库。像这样:
app.factory('Data', function ($http, $q) {
return {
ajaxItems: function () {
var deferred = $q.defer();
$http({ method: "GET", url: "/Home/GetSearchResults" })
.success(function (data, status, headers, config) {
deferred.resolve(data);
}).error(function (data, status, headers, config) {
deferred.reject(data);
});
return deferred.promise;
}
}
});
app.controller('ResultsCtrl', ['$scope', 'Data', function ($scope, Data) {
$scope.get = function () {
$scope.items = Data.ajaxItems();
// q returns a promise and THEN items
$scope.items.then(function (items) {
$scope.items = items;
}, function (status) {
console.log(status);
});
};
}]);