3

在来自 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);
  };

然后他们像这样调用更新属性:

$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 中的参数或使用原型扩展项目?
  2. 为什么我的代码中未定义更新,除非我在调用它时添加 $ 前缀?
4

3 回答 3

4

“在演示代码中,“update”实际上是在哪里添加到Project变量中的?作为$resource中的参数还是使用prototype扩展Project?

将以下代码添加到 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 函数以证明 project.$update() 存在:

Project.get({id: $routeParams.projectId}, function(project) {
   console.log('project.$update=' + project.$update)

所以现在我们有了第三个“更新”功能。然而,在演示代码中,他们没有使用这个 project.$update() 函数——而是使用他们在 Project.prototype 上定义的函数。

“为什么我的代码中未定义更新,除非我在调用它时添加 $ 前缀?”

在您的代码中,应该定义 Unit.update (这是一个资源“类”操作),当您的数据从服务器返回时,则 $scope.unit.$update 成为定义(这是一个资源“实例”操作)。Unit 是一个类,$scope.unit 是一个实例。

在您的代码中,您可能不需要使用 Unit.update,因为我猜您首先使用 Unit.get() 您的数据,然后将返回的数据分配给 $scope.unit,然后使用实例(不是类),因此您使用 $scope.unit.$update() 而不是 Unit.update() 进行更新,这是推荐的方法。

于 2012-11-29T18:26:55.483 回答
2

好的,这是来自文档

可以使用以下参数调用类对象或实例对象上的操作方法: HTTP GET “类”操作:Resource.action([parameters], [success], [error]) 非 GET “类”操作:资源.action([parameters], postData, [success], [error]) 非 GET 实例操作:instance.$action([parameters], [success], [error])

所以,当你扩展类(原型)时,调用它时不要像正常的 $ 一样,但是当你添加一个动作作为 $resource 前缀 $ 的参数时。

于 2012-11-27T12:42:58.223 回答
0

据我所知,他们用这段代码扩展了原型:

Project.prototype.update = function(cb) {
  return Project.update({id: this._id.$oid}, angular.extend({}, this, {_id:undefined}), cb);
};

然后他们在 project.js 的第 30 行创建了一个项目实例

$scope.project = new Project(self.original);

然后他们可以通过简单地调用来执行更新:

$scope.project.update(...)

如果您摆脱了扩展服务的原型,则不能调用$scope.unit.update,因为不存在 unit 的称为update的属性。

我希望它有帮助:)

于 2012-11-26T07:11:56.200 回答