3

anglejsサイトの「バックエンドの配線」デモコードで、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パラメーターが必要ないため、updateプロパティの拡張を省略しました。私が必要としているのは、更新メソッドが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. デモコードでは、「update」は実際にProject変数のどこに追加されますか?$ resourceのパラメーターとして、またはプロトタイプを使用してProjectを拡張しますか?
  2. 呼び出すときに$のプレフィックスを付けない限り、コードで更新が未定義になるのはなぜですか?
4

3 に答える 3

4

「デモコードでは、「update」は実際にProject変数に追加されますか?$ resourceのパラメーターとして、またはプロトタイプを使用してProjectを拡張しますか?」

factory()メソッドの最後に次のコードを追加します。

console.log('Project.update=' + Project.update)
console.log('Project.prototype.update=' + Project.prototype.update)
return Project;

Project.updateは関数であり、Project.prototype.updateは別の/別の関数であることがわかります。したがって、実際には2つの更新機能があります。関数Project.updateは(非GET)「クラス」アクションであるため、$プレフィックスなしで呼び出されます。update()は、$ resourceによって返されるオブジェクト(つまり、Project)で定義された関数です。実際、Project.prototype.update関数がProject.update(...)を呼び出すことがわかります。

EditCtrlでは、データがサーバーから返されるとき、プロジェクト変数はリソース「インスタンス」オブジェクト(リソース「クラス」オブジェクトとは異なります)であるため、(非GET)「インスタンス」アクションがあります。接頭辞$。それらのアクションの1つは$updateです。次のlog()をEditCtrl関数に追加して、project。$ update()が存在することを証明します。

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

これで、3番目の「更新」関数ができました。ただし、デモコードでは、このproject。$ update()関数を使用しません。代わりに、Project.prototypeで定義した関数を使用します。

「$を呼び出すときにプレフィックスを付けない限り、コードで更新が未定義になるのはなぜですか?」

コードでは、Unit.updateを定義する必要があり(これはリソースの「クラス」アクションです)、サーバーからデータが返されると、$scope.unit。$updateが定義されます(これはリソースの「インスタンス」アクションです)。 )。Unitはクラス、$scope.unitはインスタンスです。

コードでは、最初にUnit.get()でデータを推測し、次に返されたデータを$ scope.unitに割り当ててから、次を使用して更新するため、Unit.updateを使用する必要はないでしょう。インスタンス(クラスではない)であるため、推奨されるアプローチであるUnit.update()ではなく$scope.unit。$update()で更新しています。

于 2012-11-29T18:26:55.483 に答える
2

わかりました、これはドキュメントからです

クラスオブジェクトまたはインスタンスオブジェクトのアクションメソッドは、次のパラメータを使用して呼び出すことができます。HTTP GET "class"アクション:Resource.action([parameters]、[success]、[error])非GET "class"アクション:Resource .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(...)

サービスのプロトタイプの拡張を取り除いた場合、 updateと呼ばれるユニットのプロパティが存在しないため、$scope.unit.updateを呼び出すことはできません。

お役に立てば幸いです:)

于 2012-11-26T07:11:56.200 に答える