Сделайте фабрику, а не Singleton в AngularJS

ОБНОВИТЬ:

Спасибо за ваш ответ!

Я переписал свой код:

(function () {
'use strict';
angular
.module('Services', []).factory('services', ['$http', function($http,services) {
    function services($http) {

        var serviceProvider = function () {
            this.data = [];
            this.errors = [];
        }
        var model = {
            getInstance:function(){ return new serviceProvider(); }
        }
            serviceProvider.prototype.init = function(){//put some init stuff here
            }
            serviceProvider.prototype.getFromRESTServer = function(msg,callback){
                return $http.jsonp("http://xxxxxxx/JSONEngine.php?callback=JSON_CALLBACK&action="+callback+"&"+msg);
            }
            return model;
        }   
    }])
})();

И мой контроллер определяется как:

var uniqueModelInstance = services.getInstance();
uniqueModelInstance.init();
uniqueModelInstance.getFromRESTServer("username="+$scope.username+"&password="+$scope.password,"register").success(function (data) {...}

Они правы? Теперь я получаю "Не удается прочитать свойство 'getInstance' неопределенного".

Любое предложение?

Заранее спасибо. Giuseppe

У меня есть угловая фабрика, определенная таким образом:

services.factory('services', ['$http', function($http) {
    var service = {};
    return {
        getFromRESTServer: function (msg,callback){
        return $http.jsonp("http://myUrl/JSONEngine.php?callback=JSON_CALLBACK&action="+callback+"&"+msg);
        }
    }
}]);

и контроллер с функцией doLogin:

home.controller('registrazioneTraduttoreCtrl',  ['$scope', '$rootScope', '$window', 'services', '$location', 'customFactory',
function ($scope, $rootScope, $window, services, $location, customFactory) {

$scope.doLogin= function(username, password) {
    services.getFromRESTServer("username="+username+"&password="+password,"login").
    success(function (data) {
        if(data.jsonError != null || data.errCode != null)
        {
           alert (data.errMsg);
       }
       else {
           // DO STUFF...
    }).error(function(data, status) {
      console.error('Repos error', status, data);
  })

    .finally(function() {
      console.log("finally finished repos");
  });
}

}]);

GetFromRESTServer также может быть выполнен другой функцией в другом контроллере (на моей html-странице есть 2 разных регистрационных формы, а затем они вызывают функцию doLogin).

Когда я отлаживаю свое приложение, отладчик пропускает строку: services.getFromRESTServer("username="+username+"&password="+password,"login") (в функции doLogin) до конца функции getFromRESTServer, не входя и не перезапуская - выполнить функцию doLogin с именем пользователя и паролем NULL и теперь она входит в ядро ​​функции getFromRESTServer.

Есть идеи?

Заранее спасибо. Giuseppe

1 ответ

Решение

Вы можете сделать это, возвращая новый экземпляр любой фабрики, которая называется. Посмотрите на этот Plunker или попробуйте следующие коды:

/**
 * Non singleton factory example
 *
 * @name        non-singleton-example
 * @author      Nils Gajsek <info@linslin.org>
 */
(function () {

    //use strict -> ECMAScript5 error reporting
    'use strict';


    // ################################################ angularJS Module define // ####################################

    /**
     * DB service, part of app module
     */
    angular
        .module('app.model', [])  // [-_-]
        .factory('model', ['$http', model]);


    /**
     * Model factory wrapper
     *
     * @param {object} $http
     *
     * @returns self
     */
    function model($http) {


        // ################################################## Vars // ##############################################

        var serviceProvider = function(){

            /**
             * Data store
             * @type {Array}
             */
            this.data = [];


            /**
             * Error store
             * @type {Array}
             */
            this.errors = [];
        }


        // ############################################### Functions // ############################################

        /**
         * Model instance provider handler
         * This object is returned on the end of this object
         */
        var model = {
            getInstance:function(){ return new serviceProvider(); }
        }


        /**
         * Model init function, provides
         */
        serviceProvider.prototype.init = function(){

            //put some init stuff here
        }


        /**
         * Example function
         *
         * @returns {{this}}
         */
        serviceProvider.prototype.someFunction = function(){
            //do some stuff with model
        }


        //return model -> non-singleton model instance object
        return model;
    }
})();

Вот как вы получаете его как уникальный экземпляр.

 var uniqueModelInstance = model.getInstance();
 uniqueModelInstance.init();

Или лучше (но вам нужно вернуть сам экземпляр, вызвав init() функция)

var uniqueModelInstance = model.getInstance().init();
Другие вопросы по тегам