use*_*875 10 angularjs ngresource
我最近才开始学习ng-resource.我想知道在将常规AngularJS应用程序转换为使用ng-resource的应用程序时,我是否在正确的轨道上.
这是我的旧home.js
控制器(不使用ng-resource):
angular.module("HomeApp", ["BaseApp"])
.controller("MainCtrl", ["$http", "$window", "BaseService", function($http, $window, BaseService) {
var self = this;
BaseService.fetch.posts(function() {
self.posts = BaseService.posts;
self.cerrorMessages = BaseService.cerrorMessages;
});
self.like = function(id, postType) {
BaseService.like(id, postType, function() {
self.cerrorMessages = BaseService.cerrorMessages;
});
};
}]);
Run Code Online (Sandbox Code Playgroud)
这是我的旧base.js
(BaseService):
angular.module("BaseApp", [])
.factory("BaseService", ["$http", "$window", function($http, $window) {
var self = this;
self.posts = [];
self.cerrorMessages = [];
self.accessErrors = function(data) {
self.cerrorMessages = [];
for (prop in data) {
if (data.hasOwnProperty(prop)){
self.cerrorMessages.push(data[prop]);
}
}
};
self.fetch = {
posts: function(callback) {
$http.get('/posts/')
.then(function(response) {
self.posts = response.data;
callback();
}, function(response) {
self.accessErrors(response.data);
callback();
});
}
};
self.like = function(id, postType, callback) {
$http.post("/" + postType + "/" + id + "/like/")
.then(function(response) {
angular.forEach(self.posts, function(post, index, obj) {
if (post.id == id) {
post.usersVoted.push('voted');
post.voted=true;
};
});
}, function(response) {
self.accessErrors(response.data);
callback();
});
};
return self;
}]);
Run Code Online (Sandbox Code Playgroud)
有人告诉我,因为我有一个RESTful后端,所以我可以从使用ng-resources中受益匪浅.我尝试将上面的代码转换为开始使用ng-resource,这就是我现在所拥有的.这是我的resources.js
:
angular.module('PostsResources', ['ngResource'])
.factory('PostsFactory', function($resource) {
return $resource('/posts/:postId', { postId:'@id' });
});
.factory('PostLikeFactory', function($resource) {
return $resource('/posts/:postId/like', { postId:'@id' });
});
Run Code Online (Sandbox Code Playgroud)
这是我的控制器(home.js
):
angular.module("HomePageApp", ["BaseApp", "PostsApp"])
.controller("MainCtrl", ["$http", "$window", "BaseService", "PostsResource", "PostLikeResource", function($http, $window, BaseService, PostsResource, PostLikeResource) {
var self = this;
function loadPosts() {
self.posts = PostsFactory.query(function(data) {},
function(error) {
BaseService.accessErrors(error.data);
self.cerrorMessages = BaseService.cerrorMessages;
}
);
};
self.like = function likePost() {
PostLikeFactory.save(function(data) {
angular.forEach(self.posts, function(post, index, obj) {
if (post.id == id) {
post.usersVoted.push('voted');
post.voted=true;
};
});
}, function(error) {
BaseService.accessErrors(error.data);
self.cerrorMessages = BaseService.cerrorMessages;
}
)};
Run Code Online (Sandbox Code Playgroud)
这是我的BaseService(base.js
):
angular.module("BaseApp", [])
.factory("BaseService", ["$http", "$window", function($http, $window) {
var self = this;
self.posts = [];
self.cerrorMessages = [];
self.accessErrors = function(data) {
self.cerrorMessages = [];
for (prop in data) {
if (data.hasOwnProperty(prop)){
self.cerrorMessages.push(data[prop]);
}
}
};
return self;
}]);
Run Code Online (Sandbox Code Playgroud)
我是否正在将常规AngularJS应用转换为使用ng-resource?对我而言,似乎所需的代码量看起来相同.提前致谢!
我同意 @Mark 的观点,即您的 API 中可能没有足够的操作来充分利用 $resource,因此好处并不那么大。对于你现在所拥有的,如果你想使用 $resource,我会这样设置:
angular.module('PostsResources', ['ngResource'])
.factory('Post', function($resource) {
return $resource('/posts/:postId', { postId:'@id' }, {
like: {
url: '/posts/:postId/like',
method: 'POST',
params: { postId:'@id' }
}
})
});
Run Code Online (Sandbox Code Playgroud)
如果您到达每个端点使用多个操作的位置,我将拥有 Post 和 PostLike 资源,但在您的情况下,这是没有必要的。
在您的控制器中,您将能够像这样处理您的帖子:
self.posts = Post.query(null, BaseService.errorHandler(self));
self.like = function(post) {
post.$like(function() {
angular.forEach(self.posts, function(post, index, obj) {
if (post.id == id) {
post.usersVoted.push('voted');
post.voted=true;
};
});
}, BaseService.errorHandler(self));
};
Run Code Online (Sandbox Code Playgroud)
您可以将 errorHandler 方法添加到 BaseService 中以消除一些重复。它看起来像这样:
self.errorHandler = function(viewModel) {
return function(error) {
BaseService.accessErrors(error.data);
viewModel.cerrorMessages = BaseService.cerrorMessages;
};
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
359 次 |
最近记录: |