javascript - Angular 如何在我的情况下设置服务

标签 javascript angularjs service

我正在尝试在一个 Controller 中设置http请求数据,并让该数据在多个 Controller 中使用。我有类似的东西

我的服务

angular.module('myApp').service('testService', ['Product','$q',
    function(Product, $q) {
        var products, targetProduct;
        var deferred = $q.defer();

        Product.query({
            Id: 123
            }, function(products) {
                targetProduct = products[0];
                deferred.resolve(products);
        })

        var getTargetProduct = function() {
            var deferredtwo = $q.defer();

            // return deferredtwo.promise;
            deferred.promise.then(function(){
                deferredtwo.resolve(targetProduct);
            })
            return deferredtwo.promise;
        }

        var setTargetProduct = function(targetProduct) {
                targetProduct = targetProduct
        }

        return {
            setTargetProduct: setTargetProduct,
            getTargetProduct: getTargetProduct,
            productPromise : deferred.promise
        };
    }
]);

导航 Controller

  testService.productPromise.then(function(products){
            $scope.products= products;
             $scope.targetProduct = products[0];
   })
  //when user click the project  ng-click = setTargetProduct(product);
  $scope.setTargetProduct = function(targetProduct) {
         testService.setTargetProduct(targetProduct)
   }

产品详细信息 Controller

      testService.getTargetProduct().then(function(targetProduct) {
           // works when page first loads
           // but I don't know how to update the targetProduct when user select different             
           //targetProduct which means they trigger setTargetProduct() method
           $scope.targetProduct = targetProduct; 
      })

如上所述,当用户选择另一个 targetProduct 时,我不确定如何更新产品详细信息 Controller 中的 targetProduct。谁能帮我解决这个问题吗?非常感谢!

最佳答案

就风格而言,函数 getTargetProduct 不需要所有带有 Promise 的样板代码。您想要返回一个包装本地数据 targetProduct 的简单 promise 。该函数可以更加简洁:

var getTargetProduct = function() {
    return $q.when(targetProduct);
}

注意:为了方便起见,在下文中,我将通过名称 productService 来引用您的服务 testService,并通过名称 productService 来引用您的 Controller navController,名称为ProductController

Controller NavController(获取产品如下:

productService.getProducts().then(function(products) {
    $scope.products = products;
}

当用户设置目标产品时(不变):

$scope.setTargetProduct = function(targetProduct) {
   testService.setTargetProduct(targetProduct)
}

解决方案 1:嵌套 Controller

如果 ProductDetailControllerProductController 的嵌套 Controller ,则数据 targetProduct 会被共享,而无需您的任何逻辑。

解决方案 2: Controller 未通过父子关系链接

如果两个 Controller 没有通过父子关系链接,您可以使用 $broadcast 广播 updateTargetProduct 事件,并使用 $on 用于处理该事件。

在我们设置目标产品的 Controller 中,我们会发现:

$rootScope.$broadcast('updateTargetProduct', targetProduct);  

注意:$broadcast 会将事件从根作用域向下广播到子作用域。

ProductDetailController中,我们将监听此事件:

$scope.$on('updateTargetProduct', function(event, data) {
    // play with the received data
}

关于javascript - Angular 如何在我的情况下设置服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29156023/

相关文章:

C# 从 Windows 服务中保存 Exchange .EML 文件

c# - 将命令行参数添加到服务安装程序 c#

javascript - 无法获得在 AngularJS View 中显示的 ES6 promise 值

javascript - 为 AngularJS + Spring MVC 网站生成静态 SEO 页面

AngularJS 性能 - 太多观察者?

php - 在 Symfony2 中创建服务表单

javascript - 如何内联定义 AngularJS 函数(在 HTML 中)?

javascript - 多个ajax调用同时互相覆盖

javascript - 尝试使用 Chrome 扩展程序删除 Gmail 中的广告

javascript - 使用javascript和html隐藏iphone中的地址栏和状态栏