javascript单例公共方法“不是函数”

时间:2018-07-04 03:51:42

标签: javascript singleton public-method

我放弃。我通常是c#开发人员,但该特定项目需要javascript。

我有一个列表,希望使用一些setter和getter(以及公共方法和私有帮助方法)进行保护。为此,我已按照Addy Osmani的Singleton模式实现了单例模式,如本文中所述:http://robdodson.me/javascript-design-patterns-singleton/

但是,当我尝试访问公共方法时,出现错误“ publicMethod不是函数”。

我有一个连接到“ addToList”的按钮,我只想打印出开始的消息。

为什么看不到我的方法?

angular
.module('bacnetui')
.controller('bacnetuiController', function($scope, devicesFactory,){

   devicesFactory.getDevices().then(function (response){
     $scope.devices = response.data;
   }, function(error) {
    console.log(error);
   });


   $scope.mySingleton = (function () {
    // Instance stores a reference to the Singleton
    var instance;

    function init() {
      // Singleton
      var list = [];

      // Private methods and variables
      function indexOfDevice(dev){
       ...
     }

     function hasBacnet(dev,obj,prop){
       ....
     }
     function newBacnet(obj,prop){
        ....
     }

      return {

        // Public methods and variables
        publicMethod: function () {
          console.log( "The public can see me!" );
        },

        publicProperty: "I am also public"
      };
    };

    return {
      // Get the Singleton instance if one exists
      // or create one if it doesn't
      getInstance: function () {
        if ( !instance ) {
          instance = init();
        }
        return instance;
      }
    };
  })();


  $scope.addToList = function(device,obj,prop) {
    console.log("found a function: " + $scope.mySingleton.publicMethod());

    //$scope.myList.addBacnet(device,obj,prop);
  };

  $scope.removeFromList = function(device,obj,prop) {};

  $scope.saveToFile = function(){

  };
});

1 个答案:

答案 0 :(得分:0)

您需要按照评论中@Robby的说明使用$scope.mySingleton.getInstance().publicMethod()

以下是流程:

  $scope.mySingleton = (function () {
    ...
    function init() {
      ...
      return {
        publicMethod: function () {
          ...
        },
      };
    };

    return {
      // Get the Singleton instance if one exists
      // or create one if it doesn't
      getInstance: function () {
        if ( !instance ) {
          instance = init();
        }
        return instance;
      }
    };
  })();

以上结构返回mySingleton,并为其分配了一个对象,如下所示:

{
   getInstance: function() {...}
}

致电后,您就可以访问init()返回的目标publicMethod()