工厂价值没有在模型中更新......我做错了什么?

时间:2016-03-07 10:15:23

标签: angularjs

我是angular-js的新手。我有两个控制器(welcomeContoller,productController),并且都在工厂内处理相同的模型。

当模型通过一个控制器(productController)进行更新时,它应该反映另一个控制器中的更新。 (welcomeContoller)

但它现在没有发生。

HTML code:

 <body ng-app="myApp">
<div ng-controller="welcomeContoller">
  {{totalProductCnt}}
</div>
<div ng-controller="productController">
  <div class="addRemoveCart">
    <span class="pull-left glyphicon glyphicon-minus" ng-click="removeProduct()"></span>
    <span class="pull-right glyphicon glyphicon-plus" ng-click="addProduct(1)"></span>
  </div>
</div>

JS代码

var myApp = angular.module("myApp", ['ui.bootstrap']);
myApp.factory("productCountFactory", function() {
  return {
    totalProducts:0
  };
});
myApp.controller("welcomeContoller", function($scope, productCountFactory) 
{
  $scope.totalProductCnt = productCountFactory.totalProducts;
});

 myApp.controller("productController", function($scope, productCountFactory) {
   $scope.addProduct = function() {
productCountFactory.totalProducts++;
alert(productCountFactory.totalProducts);
     };
  $scope.removeProduct = function() {
     if(productCountFactory.totalProducts >=1)
         productCountFactory.totalProducts--;
        alert(productCountFactory.totalProducts);
     };
    });

即使在调用addProduct之后,totalProductCnt也显示为零。我想显示每个增量的值。

Plunkr Link

2 个答案:

答案 0 :(得分:1)

来自welcomeCont r oller的totalProductCnt未更新,因为在创建控制器时仅分配了一次。

您可以使用多种解决方案刷新显示的值。在工厂中为您的totalProducts使用getter:

myApp.factory("productCountFactory", function() {
    var totalProducts = 0;
    return {
        getTotalProducts: function() {
            return totalProducts;
        },
        addProduct: function() {
            totalProducts++;
        },
        removeProduct: function() {
            totalProducts--;
        }
    };
});
myApp.controller("welcomeContoller", function($scope, productCountFactory) {
    $scope.getTotalProducts = productCountFactory.getTotalProducts;
});

myApp.controller("productController", function($scope, productCountFactory) {
    $scope.addProduct = function() {
        productCountFactory.addProduct();
    };
    $scope.removeProduct = function() {
        if (productCountFactory.getTotalProducts() >= 1)
            productCountFactory.removeProduct();
    };
});

并相应地更新视图:

<div ng-controller="welcomeContoller">
  {{getTotalProducts()}}
</div> 

Plunkr Link

答案 1 :(得分:1)

将工厂对象引用放在范围:

myApp.controller("welcomeContoller", function($scope, productCountFactory) {

    $scope.productCountFactory = productCountFactory;

});

观察对象的属性。

  {{productCountFactory.totalProducts}}

DEMO on PLNKR

通过在范围上放置引用,在每个摘要周期,观察者查找属性的值并在有更改时更新DOM。