javascript синглтон публичный метод "не функция" - PullRequest
0 голосов
/ 04 июля 2018

Я сдаюсь. Я обычно являюсь разработчиком на c #, но мне нужен javascript для этого конкретного проекта.

У меня есть список, который я хочу защитить с помощью некоторых сеттеров и геттеров (а также общедоступных методов по сравнению с частными вспомогательными методами). Для этого я реализовал шаблон синглтона, следуя шаблону синглтона Адди Османи, как описано в этом посте: 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 голосов
/ 04 июля 2018

Вам нужно использовать $scope.mySingleton.getInstance().publicMethod(), как @Robby указал в комментарии.

Следующий поток:

  $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().

...