在"连接后端"来自angularjs站点的演示代码,他们设置了一个db调用。据我所知,他们正在扩展更新功能,以便添加mongolab api所需的一些额外参数。
angular.module('mongolab', ['ngResource']).
factory('Project', function($resource) {
var Project = $resource('https://api.mongolab.com/api/1/databases' +
'/angularjs/collections/projects/:id',
{ apiKey: '4f847ad3e4b08a2eed5f3b54' }, {
update: { method: 'PUT' }
}
);
Project.prototype.update = function(cb) {
return Project.update({id: this._id.$oid},
angular.extend({}, this, {_id:undefined}), cb);
};
然后他们调用update属性:
$scope.save = function() {
$scope.project.update(function() {
$location.path('/');
});
我尝试使用此代码使用本地开发服务器构建演示应用,因此我省略了扩展更新属性,因为我不需要额外的$ oid参数。我需要的是指定更新方法应该使用PUT。我的代码是这样的:
var Unit = $resource('http:/localhost/api/unit/:id', {id:'@Unit_Id'},
{'update': { method: 'PUT' }});
然后这样称呼它:
$scope.save = function () {
$scope.unit.update(function () {
$location.path('/unitlist');
});
但我发现的是,代码只会在更新前面以美元符号运行,如下所示:
$scope.save = function () {
$scope.unit.$update(function () {
$location.path('/unitlist');
});
所以这是我的问题:
答案 0 :(得分:4)
“在演示代码中,”更新“实际添加到项目中 变量?作为$ resource中的参数或使用prototype来扩展 项目?“
将以下代码添加到factory()方法的末尾:
console.log('Project.update=' + Project.update)
console.log('Project.prototype.update=' + Project.prototype.update)
return Project;
我们看到Project.update是一个函数,而Project.prototype.update是另一个/不同的函数。所以实际上有两个更新功能。函数Project.update是一个(非GET)“类”动作,因此它被调用而没有$前缀。 update()是在$ resource返回的对象上定义的函数 - 即Project。实际上,我们看到函数Project.prototype.update调用了Project.update(...)。
在EditCtrl中,当从服务器返回数据时,项目变量是资源“实例”对象(与资源“类”对象不同),因此它具有(非) -GET)“实例”操作,以$为前缀。其中一项行动是$ update。将以下log()添加到EditCtrl函数以证明该项目。$ update()存在:
Project.get({id: $routeParams.projectId}, function(project) {
console.log('project.$update=' + project.$update)
所以现在我们有了第三个“更新”功能。但是,在演示代码中,他们不使用这个项目。$ update()函数 - 他们使用他们在Project.prototype上定义的函数。
“为什么我的代码中的更新未定义,除非我在调用它时使用$前缀?”
在你的代码中,应该定义Unit.update(这是一个资源“类”操作),当你从服务器返回数据时,$ scope.unit。$ update被定义(这是一个资源“实例“动作”。 Unit是一个类,$ scope.unit是一个实例。
在你的代码中,你可能不需要使用Unit.update,因为我猜测你首先是Unit.get()你的数据,然后你将返回的数据分配给$ scope.unit,然后你更新它使用实例(而不是类),因此您使用$ scope.unit。$ update()而不是Unit.update()进行更新,这是推荐的方法。
答案 1 :(得分:2)
好的,这是from the docs
类对象或实例对象上的操作方法可以是 使用以下参数调用:HTTP GET“class”操作: Resource.action([参数],[成功],[错误])非GET“类” actions:Resource.action([parameters],postData,[success],[error]) 非GET实例操作:实例。$ action([参数],[成功], [错误])
所以,当你扩展类(原型)的时候,在没有正常的$的情况下调用它,但当你添加一个动作作为$ resource prefix $的参数时。
答案 2 :(得分:0)
据我所知,他们用这段代码扩展了原型:
Project.prototype.update = function(cb) {
return Project.update({id: this._id.$oid}, angular.extend({}, this, {_id:undefined}), cb);
};
然后他们在project.js
的第30行创建了一个Project实例$scope.project = new Project(self.original);
然后他们可以通过简单地调用:
来执行更新$scope.project.update(...)
如果您不再扩展服务原型,则无法调用 $ scope.unit.update ,因为没有名为 update
我希望它有所帮助:)