2014-04-14 60 views
4

我想分享控制器之間的ID在角角服務

我創建了一個服務如下:

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(); 
}]); 

我收到一個錯誤,無法調用未定義的方法,顯然我正在注入服務不正確。有人可以幫忙嗎?

編輯:

基於下面的解決方案,服務不再生成錯誤,但是我無法獲得ID varaible回來,我可以看到,它會從一個控制器設置的,但它仍然是在檢索時未定義:

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:使用「服務」或「價值」取決於您的要求。如果你只需要一個普通的值,使用'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

這是因爲您需要將一個對象中的ID。

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; 
     } 
    } 
}])