angularjs调用$ resource参数和美元符号

时间:2012-11-26 05:13:38

标签: angularjs

在"连接后端"来自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');
    });

所以这是我的问题:

  1. 在演示代码中,"更新"实际上添加到Project变量?作为$ resource中的参数或使用原型来扩展Project?
  2. 为什么我的代码中的更新未定义,除非我在调用它时使用前缀$?

3 个答案:

答案 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

我希望它有所帮助:)