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


大厅-storage.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

这里的重点是我们调用的是函数而不是构造函数

// 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 回答
1

当您使用“new”调用 LobbyRoom 时,意味着您正在创建一个新对象。LobbyRoom 使用的“this”将属于您正在创建的新对象,并且不会引用该类。你应该做两件事之一。创建一个 LobbyRoom 类或调用 LobbyRoom 而不使用“new”,如下所示:

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