Мой сервис возвращает текст функции, а не объект

0

У меня есть служба для совместного использования объекта в моем приложении... Я хочу опубликовать этот объект в mongo db, но когда я вызываю функцию, которая должна возвращать объект, он дает мне текст функции.

Услуга находится здесь:

angular.module('comhubApp')
  .service('markerService', function () {
  this.markers = [];
    this.newMarker = {  title: '',
        description: '',
        lat: '',
        lon: '',
        user: '',
        created_at: '' };
// This is supposed to return the marker object
    this.newMarker = function  () {
        return this.newMarker;
    };
    this.setTitle = function (title) {
        this.newMarker.title = title;
        console.log('title service set: ' + title);
    };
    this.setDescription = function (description) {
        this.newMarker.description = description;
        console.log('Description service set: ' + description);
    };
    this.setLat = function (lat) {
        this.newMarker.lat = lat;
        console.log('lat service set: ' + lat);
    };
    this.setLon = function (lon) {
        this.newMarker.lon = lon;
        console.log('lon service set: ' + lon);
    };
    this.reset = function () {
        this.newMarker =  { title: '',
            description: '',
            lat: '',
            lon: '',
            user: '',
            created_at: ''};
            }

    this.setMarkers = function (markers) {
        this.markers = markers;
    }
    this.markers = function () {
        return this.markers;
    }
    this.addMarker = function (marker) {
        //todo append marker
    }
});

newMarker возвращает:

this.newMarker = function  () {
        return this.newMarker;
    };

Контроллер, использующий услугу, находится здесь

$scope.addMarker = function() {
if($scope.newMarker.title === '') {
    console.log('newMarker title is empty');
  return;
}

markerService.setTitle($scope.newMarker.title);
markerService.setDescription($scope.newMarker.description);

console.log(markerService.newMarker());
// $http.post('/api/markers', { name: $scope.newMarker });
// $scope.newMarker = '';
};

$ scope новый маркер - это данные формы. Я попытался включить это право в свою службу без успеха. Вместо этого я вывожу данные формы в контроллер, а затем нажимаю на службу. Если есть лучший способ сделать это, пожалуйста, дайте мне знать.

Если эта услуга плоха каким-либо другим способом, дайте мне знать, что я новичок во всем этом, и поэтому я последовал за другим ответом, который я видел здесь.

Теги:
mean

2 ответа

0
Лучший ответ

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

this.newMarker = { ... };
this.getNewMarker = function () { return this.newMarker };

РЕДАКТИРОВАТЬ:

Вы также должны всегда создавать новый экземпляр из маркера. В противном случае вы просто редактируете один и тот же объект все время. Вот пример, который я сделал. Это не лучшая практика, но надеюсь, что вы поняли.

angular.module('serviceApp', [])
.factory('Marker', function () {
    function Marker() {
        this.title = '';
        this.descrpition = '';
    }

    // use setters and getters if  you want to make your variable private
    // in this example we are not using these functions
    Marker.prototype.setTitle = function (title) {
        this.title = title;
    };

    Marker.prototype.setDescription = function (description) {
        this.description = description;    
    };

    return Marker;
})
.service('markerService', function (Marker) {
    this.markers = [];
    this.getNewMarker = function () {
        return new Marker();
    }
    this.addMarker = function (marker) {
        this.markers.push(marker);
    }

})
.controller('ServiceCtrl', function ($scope, markerService) {
    $scope.marker = markerService.getNewMarker();
    $scope.addMarker = function () {
        markerService.addMarker($scope.marker);
        $scope.marker = markerService.getNewMarker();
    }
    $scope.markers = markerService.markers;
});

Вы также можете создать маркер в контроллере и использовать функцию markerService только для хранения вашего объекта.

И рабочая демонстрация: http://jsfiddle.net/3cvc9rrs/

  • 1
    Есть также хороший ответ об услугах и фабриках: stackoverflow.com/a/21900284/2112228
  • 0
    Я немного смущен, я пропустил, что функция была переопределена таким образом. Интересно, почему пример, который я использовал, сделал это? Причина, по которой я воспользовался сервисом, заключалась в том, что я получаю координаты в контроллере карты, которые отправляю в форму добавления маркера для ввода данных. Благодаря вашему предложению я собираюсь удалить массив маркеров из сервиса и сохранить его в контроллере карты для удобства доступа.
0

Таким образом, эта функция является проблемой. Я слепо следил за другим примером, и в моем случае это было неправильно. Решение заключается в том, чтобы удалить эту функцию и напрямую обратиться к markerService.newMarker.

Я все еще достаточно большой noob, что я не уверен, почему вызов возвращал функцию в виде строки. Кажется, он имеет какое-то отношение к тому, как он называется, но это всего лишь предположение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню