2014-04-14 3 views
4

Я пытаюсь разделить идентификатор между контроллерами в угловомУгловые услуги

Я создал службу следующим образом:

app.factory("idService", function() { 
    var id; 
    addId = function(id) { 
     id = id; 
    }; 
    getId = function() { 
     return id; 
    };  
}); 

В моем контроллере я пытаюсь использовать эту услугу следующим образом:

app.controller('photoFormController', ['$scope', '$http', 'idService' , function($scope, $http, idService) { 

     $scope.id = idService.getId(); 
}]); 

Я получаю сообщение об ошибке, когда метод undefined невозможен, очевидно, что я неправильно ввел службу. Может кто-нибудь помочь?

EDIT:

На основании решения ниже, служба больше не приводит к ошибкам, однако я не могу получить Название переменной ID назад, я могу видеть, что он получает набор из одного контроллера, однако он по-прежнему не определено в при получении:

app.factory("idService", function() { 
    var id; 
    addId = function(id) { 
     id = id; 
     console.log("added id of: " + id); 
    }; 
    getId = function() { 
     console.log("trying to return : " + id); 
     return id; 
    }; 
    return { 
     addId: addId, 
     getId: getId 
    }; 
}); 
+0

В 'addId' функции 'id = id' не имеет смысла, поскольку он присваивает первый аргумент самому себе – Vadim

+0

@Vadim моя ошибка, отсортированная сейчас ... – avrono

ответ

6

Вы должны вернуть объект внутри factory. Возвращаемый объект Ваш экземпляр службы:

+0

Я больше не получаю ошибку, однако мне не удается вернуть заданную переменную ... может это вопрос времени? – avrono

+0

@avrono: попробуйте 'var _id;', чтобы избежать затенения вашей переменной с тем же именем. –

+0

Спасибо, это было ... – avrono

0

Вам не нужно создать службу для того, чтобы разделить некоторую переменную, просто использовать value():

JavaScript

angular.module('app',[]). 
    value('share', {id: 123}). 
    run(['share', function(share) { 
    console.log(share.id); // <= 123 
    share.id = 345; 
    }]). 
    controller('appController', ['$scope', 'share', function($scope, share) { 
    $scope.id = share.id; // <= 345 
    }]); 

Plunker : http://plnkr.co/edit/m55hmFgBvi1rwVsYMeKU?p=preview

+0

Я попробую, кажется, проще, чем вариант сервиса ... этот метод работает через несколько контроллеров? – avrono

+0

@avrono Да, это работает как услуга, которую вы можете вводить куда угодно, как обычные сервисы. Это также синглтон, так что будет только одно такое значение, которое будет доступно в приложении. – Vadim

+0

@avrono: использование 'service' или просто' value' зависит от вашего требования. Если вам просто нужно простое значение, лучше используйте 'value', если вам нужно добавить больше логики в' addId' (например, проверить параметр) и 'getId', вы должны использовать сервис. –

0

Пример службы, в которой хранятся данные между контроллерами:

'use strict'; 

angular 
    .module('app') 
    .factory('youService', youService); 

youService.$inject = ['$rootScope']; 
function youService($rootScope) { 
    var service = {}; 
    var questions = []; 
    // Data 
    function getData() { 
     return questions; 
    }; 
    function setData(newQuestion) { 
     questions.push(newQuestion); 
    }; 
    function resetData() { 
     questions = {}; 
    }; 

    // Services 
    service.getData = getData; 
    service.setData = setData; 
    service.resetData = resetData; 
    return service; 
}; 

В контроллере:

angular.module('app') 
.controller('yourController', yourController); 
stepFourController.$inject = ['$scope', 'youService']; 
function yourController($scope, youService){ 
    // Get saved data from service 
    $scope.model = youService.getData(); 
    // Set data to service 
    youService.setData($scope.model); 
    // Reset data in service 
    youService.resetData(); 
}; 
+1

Использование rootScope в сервисах - это плохо! Не вводите область применения или rootScope в бизнес-аналитику. –

1

Это потому, что вам необходимо поместить идентификатор в пределах объекта.

fiddle

Эта идея заключается в следующем:

myApp.controller('ctrl1', function($scope, myservice) { 
    $scope.updateId = function() { 
    myservice.setId($scope.input) 
    }; 
}); 


myApp.controller('ctrl2', function($scope, myservice) { 
    $scope.data = myservice.getData(); 
}); 

myApp.service('myservice', function() { 

    var myservice = this; 

    var data = {}; 

    myservice.setId = function(newValue) { 
    data.id = newValue; 
    }; 

    myservice.getData = function() { 
    return data; 
    } 

}); 

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

0

Лучший способ обмена данными между контроллером через службы или заводов Услугу можно записать в виде:

var myApp = angular.module('myApp', []); 
myApp.service('shareId', [function() { 
    var shareIdService = this; 
    shareIdService.id = ''; 
    shareIdService.setId = function (id) { 
     shareIdService.id = id; 
    } 
    shareIdService.getId = function() { 
     return shareIdService.id; 
    } 
}]); 

или завод может быть записан как в

myApp.factory('shareId', [function() { 
    var id = ''; 
    return { 
     setId:function (id){ 
      id=id; 
     }, 
     getId:function(){ 
      return id; 
     } 
    } 
}]) 
Смежные вопросы