父控制器收听来自子控制器的事件

问题描述:

我有一个父shell的html文件,它有一个图标来更新购物车中的产品数量。该号码应该从工厂中取回。父控制器收听来自子控制器的事件

angular 
    .module('awesome') 
    .factory('ProductFactory', productFactory); 
    function productFactory($log) { 
    var factory = { 
     addCartProducts: addCartProducts, 
     getCartCount: getCartCount 
    }, 
    cartProducts = []; 

    return factory; 

    function addCartProducts(product) 
    { 
     cartProducts.push(product); 
     getCartCount(); 
     $log.info(cartProducts.length); 
    } 
    function getCartCount() { 
     return cartProducts.length; 
    } 
} 

在父控制器我有一个scope值从

$scope.count = ProductFactory.getCartCount() 

拉进孩子控制器我添加到购物车

$scope.addToCart = function (product) { 
    ProductFactory.addCartProducts(product); 
}; 

然而,当我加入到购物车,我可以在日志中看到它们正在添加,但是,父控制器中的项目不会更新。我错过了什么?

+3

父控制器的代码片段是什么? – ABOS

+0

对不起,我把它叫做'shell'控制器,这是父代码片段 –

+0

shell控制器如何知道孩子已经更新。你没有向我们展示我相信的相关代码。 – PSL

您的计数未更新的原因是您将其设置为ProductFactory.getCartCount()所返回的值。如果您在控制器中对$ scope.count进行了进一步更改,则会发生更新,但对ProductFactory.getCartCount()的进一步更改不会。 这里是东西,你可以这样做:

父控制器:

$scope.getCount() = function() { 
    return ProductFactory.getCartCount(); 
} 

,并在您的视图,而不是使用{{数}},使用{{getCount将()}}

我希望这可以帮助!

+2

虽然这不是一个好习惯..恕我直言......这和在ProductFactory.getCartCount()上添加手表一样好。但是,如果OP不只是在视图上显示计数,而是在添加项目时寻找某些东西,那么该怎么办? – PSL

+1

嗯......正如你所提到的,如果OP想要操纵父控制器的计数器,这也不会是理想的......但是如果是这样的话,OP会更好,并且有一个监听$ broadcasts的指令,而不是在控制器中使用此代码。 –

+1

是的,我和你在一起。使用自己的控制器构建组件(指令),从指令中监听事件并调用相应的控制器方法。 – PSL