0

我正在成功解析服務中的內容並將該承諾傳遞給其他服務。我希望能夠對該承諾的解決價值做些事情,然後將其存儲爲可以從注入該服務的控制器引用的方式。如何將內容從服務傳遞給另一個服務,如果內容發生了某些情況並將其傳遞給控制器​​?

我不太清楚如何做到這一點。這裏是我的嘗試:

angular.module('test').service("service1", function($q) { 
      function doSomething(something) {  
       //parses some data 
       return deferred.promise; 
      } 
     } 

     return { 
      function1: function1 
     } 
}); 

angular.module('test').service("service2", ['service1', function(service1) { 
    function function1() { 
     service1.doSomething("test").then(function (result) { 
      var alteredResult = result + "Altered"; //I need to store this value so I can reference it from controllers that are injected with this service 
     }); 
     return alteredResult; 
    } 
}]); 


angular.module('test').controller('testController', ['$scope', 'service2', function ($scope, service2) { 

     $scope.test = service2.function1(); 

}]); 

我能夠從服務順利通過最初的承諾,以服務控制器通過的承諾,並與我的變更以及控制器做.then,但我想保持這種邏輯在service2。我希望能夠將此值存儲在service2中,以便在將其注入多個控制器時可以訪問它。

如何獲取要更改的內容以存儲在我的第二個服務中?我需要創造一個新的承諾嗎?

非常感謝您的時間。如果您需要我提供任何其他信息或者我不清楚,請告訴我。

Here is a previous post其中有人幫助我成功地將承諾從服務傳遞給控制器​​,以便它可以從控制器訪問和更改,這可能是有用的。

回答

0

如果您想與多個控制器共享相同的值,您可以將更改後的值存儲在service2的對象中並將其公開給控制器。

angular.module('test').service("service2", ['service1', 
    function(service1) { 
    // we're exposing an object with a null property 
    var myResult = { 
     alteredResult: null 
    }; 

    function function1() { 
     service1.doSomething("test").then(function(result) { 
     // set the alteredResult property to the actual result 
     myResult.alteredResult = result + "Altered"; 
     }); 

    } 

    return { 
     function1: function1, 
     myResult: myResult 
    }; 
    } 
]); 

在控制器則可以:

angular.module('test').controller('testController', ['$scope', 'service2', 
    function($scope, service2) { 

    // get a reference the server's exposed object, it's alteredResult property will be filled in later. 
    $scope.myservice2Result = service2.myResult; 
    $scope.test = service2.function1(); 


    } 
]); 

如果您需要在服務2返回調用的結果只給調用者,那麼你可以創建一個新的承諾。

+0

感謝您伸出援手!我有幾個問題。如果控制器中的行讀取'var myservice2Value = service2.myResult;'而不是'var myservice2Value = service2.myValue;''?當我在我的項目中遵循你的回答時,我的控制器中'myResult'仍爲空。當我放入一些斷點時,我發現函數不會改變'alteredResult',直到控制器已經將'myservice2Value'存儲爲null。這對你有意義嗎?非常感謝你的幫助。 – user95227

+0

我給出的例子中有幾個錯誤。我現在糾正了他們。這個想法是,該對象將公開一個控制器可以引用的對象。在http請求結束後,我們將把結果設置爲暴露對象的屬性。這樣任何控制器都會緩存該值。此外,如果您將使用HTML角度中的$ scope.myservice2Result.value,請求完成後將自動顯示新的更新值。 – toskv

+0

需要注意的是,如果您不需要在服務中緩存該值,那麼您可以使用$ q做出新的承諾,並將其與第一個服務類似。 – toskv

相關問題