【问题标题】:Sharing data between controllers using promises?使用承诺在控制器之间共享数据?
【发布时间】:2014-02-18 23:50:50
【问题描述】:

好的,我在一个服务中有这个功能:

wikiServices = angular.module('wikiServices', []);

wikiServices.factory('newsService', function($http, $q){
 var chosenNewsStory = "";

 var getNewsStory = function(news_id, callback){
    var deferred = $q.defer();
    $http({
        method: "GET",
        url: "news/article/" + news_id
    })
    .success(function(newsStory){
        deferred.resolve(newsStory);
        console.log("RESOLVED " + newsStory);   
    });
    return deferred.promise;
 });

控制器 1:

wikiControllers =  angular.module('wikiControllers', []);
wikiControllers.controller('ctrl1', ['$scope', 'newsService',
  function($scope, newsService){
   $scope.getNewsStory = newsService.getNewsStory(function(input){
     newsService.getNewsStory(news_id);
   };
});

控制器 2:

wikiControllers =  angular.module('wikiControllers', []);
wikiControllers.controller('ctrl1', ['$scope', 'newsService',
  $scope.watch('newsService.chosenNewsStory', function(newVal){
     console.log(newVal);
  });
});

现在,我已经尝试在服务的很多地方设置“chosenNewsStory”,但我认为我错过了整个 JS 的一个关键部分——“体验”。

我在将服务中的“var selectedNewsStory”设置为从服务器获取的 newsStory 时遇到问题。我该怎么做?

谢谢。

【问题讨论】:

  • 请显示更多代码
  • 我回家后会做的。
  • 好的,已经更新了。 :)
  • 你必须从服务中return chosenNewsStory`,否则你将无权访问它,因此你的$watch 没有做任何事情。对于需要共享的变量,我更喜欢返回 getset 方法。
  • 我已经设法检索到变量,但我无法设置它。我应该把设置代码放在哪里?我试图在 deferred.resolved() 之前设置 selectedNewsStory = newsStory 但我认为这是一个范围问题。

标签: angularjs


【解决方案1】:

您应该为共享的变量定义getset 方法,并返回这些方法。我会像这样格式化您的服务:

wikiServices.factory('newsService', function($http, $q){
    var chosenNewsStory = "";

    return {
        getNewsStory: function(news_id, callback){
            var deferred = $q.defer();
            $http({
                method: "GET",
                url: "news/article/" + news_id
            }).success(function(newsStory){
                deferred.resolve(newsStory);
                console.log("RESOLVED " + newsStory);   
            });
            return deferred.promise;
        },

        getNews: function() {
            return chosenNewsStory;
        },

        setNews: function(story) {
            chosenNewsStory = story;
        }
    }
});

现在您可以观看newsService.getNews() 并使用newsService.setNews(news) 进行设置

【讨论】:

  • 那么我应该在调用 getNewsStory 的控制器中使用 setNews 吗?
  • 是的,这将在服务中设置它,而您的其他控件$watch(现在应该关注newsService.getNews())应该接受更改。
猜你喜欢
  • 1970-01-01
  • 2015-12-15
  • 2014-03-22
  • 1970-01-01
  • 2013-05-28
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多