【问题标题】:How do I pass an object data as a value (not as reference) using angularJS $broadcast如何使用 angularJS $broadcast 将对象数据作为值(而不是参考)传递
【发布时间】:2016-06-30 04:52:36
【问题描述】:

我正在尝试使用 AngularJS $broadcast 事件在两个控制器中传递一些 dataaction。但我在将数据作为值(而不是引用)传递时会遇到问题。

到目前为止,我首先创建了一个函数,该函数在 shopping-cart.controller.js 中使用 shoppingCart 的对象广播 sendCartPreview 事件

//function inside shopping-cart.controller.js
function sendCartPreview() {
  var shoppingCart = $scope.shoppingCart;
  $rootScope.$broadcast('sendCartPreview', shoppingCart);
}

然后我在另一个控制器上添加一个事件侦听器,该控制器检索购物车数据并将数据值传递给控制器​​内的sendCartPreview 函数

//function inside chat.controller.js
$scope.$on("sendCartPreview", function(event, message){
  sendCartPreview(message);
})

基本上 sendCartPreview 函数接收对象数据并将其添加到消息数组中。

function sendCartPreview(shopping_cart) {
  //some logic here and push the data to an array
  vm.arrayOfMessage.push(shopping_cart);
}

我面临的问题是,每当$scope.shoppingCart 的值发生变化时,vm.arrayOfMessage 内部的值也会根据各自的变化而变化。同时我想要实现的是将数据作为值传递(而不是通过引用),这样每次 $scope.shoppingCart 值发生变化时,它都不会影响 vm.arrayOfMessage 中的数据。我该如何做到这一点?在这方面需要您的帮助,任何形式的帮助将不胜感激,谢谢!

【问题讨论】:

  • 使用 $rootScope.$apply() 或 $scope.$apply();

标签: javascript angularjs events broadcast


【解决方案1】:

进行像sendCartPreview(angular.copy(message));这样的深拷贝调用

【讨论】:

    【解决方案2】:

    这很容易。我假设你也有 jquery。

    var cart = jQuery.extend(true, {}, shoppingCart);
    

    &广播车。

    【讨论】:

    • 我认为我更喜欢使用 angular.copy。无论如何感谢您的帮助!
    【解决方案3】:

    您可以使用 angular.copy,了解更多信息:https://docs.angularjs.org/api/ng/function/angular.copy

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-25
      • 2021-10-30
      • 2018-08-17
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 2019-10-19
      相关资源
      最近更新 更多