0

新しいリソース オブジェクトを初期化するのに苦労しています。

REST API からのデータの取得は問題なく機能します。

エラーは、次のコード行でスローされます。

var newRoom = new this.lobbyStorage.LobbyRoom();

次のメッセージが表示されます。

「this.$ngResource は関数ではありません」

私はかなりの数のことを試してきましたが、良い結果につながるものは何もありませんでした.

解決

構文 new Function(...) または単に Function(...) で作成された関数の name プロパティは、空の文字列に設定されます。次の例では、無名関数が作成されるため、name は空の文字列を返します。

関数の名前は変更できません。このプロパティは読み取り専用です。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name


ロビーストレージ.ts

module lobby.services {
  export class LobbyStorage {

    private baseUrl : string = 'http://localhost:2999'; /*this.appConstant.baseUrl + '/lobby';*/

    public static $inject = [
      '$http',
      '$resource'
    ];

    constructor(private $http: ng.IHttpService, private $ngResource : ng.resource.IResourceService /*,private appConstant*/) {

    }

    public LobbyRoom() : ng.resource.IResourceClass<ng.resource.IResource<any>> {
      return this.$ngResource(this.baseUrl + '/lobby/:id', { id: '@id' });
    }
  }
}

ロビーモジュール.ts

///<reference path='../../typings/tsd.d.ts' />
module lobby {
  'use strict';

  /* @ngdoc object
   * @name lobby
   * @description
   *
   */
  angular
    .module('lobby', [
      'ngRoute',
      'ngResource'
    ])
    .service('lobbyStorage', lobby.services.LobbyStorage)
  /* .constant('appConstant', lobby.constants.Constants.Default);*/
}

ロビーコントローラー.ts

/// <reference path='../_lobby.ts' />

module lobby.controllers {
  'use strict';

  class LobbyCtrl {

    public lobbyData : Array<string>;
    public gameCreation : boolean = true;
    public currentItem : any = {};

    // $inject annotation.
    // It provides $injector with information about dependencies to be injected into constructor
    // it is better to have it close to the constructor, because the parameters must match in count and type.
    // See http://docs.angularjs.org/guide/di
    public static $inject = [
      '$scope',
      '$log',
      'lobbyStorage'
    ];

    // dependencies are injected via AngularJS $injector
    constructor(private $scope, private $log : ng.ILogService, private lobbyStorage) {
      this.init();
    }

    // Initializer function
    private init(){
      this.initializeLobbyData();
    }

    public createRoom() : void{
      var newRoom = new this.lobbyStorage.LobbyRoom();
      newRoom.name = this.currentItem.name;
      newRoom.$save();
    }

    public initializeLobbyData(){
      var res = this.lobbyStorage.LobbyRoom().query(
        () => this.lobbyData = res,
        () => this.lobbyData[0] = "Error"
      );
    }
  }


  /**
  * @ngdoc object
  * @name lobby.controller:LobbyCtrl
  *
  * @description
  *
  */
  angular
    .module('lobby')
    .controller('LobbyCtrl', LobbyCtrl);
}
4

2 に答える 2

1

'new' を指定して LobbyRoom を呼び出すと、新しいオブジェクトを作成することを意図しています。'this' LobbyRoom が使用するのは、作成中の新しいオブジェクトであり、クラスを参照しません。2 つのことのいずれかを行う必要があります。LobbyRoom クラスを作成するか、次のように「new」を使用せずに LobbyRoom を呼び出します。

var newRoom = this.lobbyStorage.LobbyRoom();
于 2015-08-06T15:02:43.100 に答える
1

ここでのポイントは、コンストラクターではなく関数を呼び出すことです

// wrong
// this is not constructor call
var newRoom = new this.lobbyStorage.LobbyRoom()

// ok
// just a method
var newRoom = this.lobbyStorage.LobbyRoom()

壊れた例があります(実行をクリックするだけです)

var x = new lobby.services.LobbyStorage({}, (str) => {return str});

try {
  var y = new x.LobbyRoom();
}
catch (ex){
  alert(ex);    
}

それをコンストラクターとしてではなく、メソッドとして呼び出す場合は、次のように動作します。

var x = new lobby.services.LobbyStorage({}, (str) => {return str});

var y =  x.LobbyRoom();

alert(y);

ここでそのバージョンを確認してください

于 2015-08-06T15:12:17.510 に答える