在angularjs 1中的两个控制器之间进行通信

时间:2017-04-21 03:18:55

标签: javascript angularjs cordova

我试图传达两个controllers

var main = angular.module('starter', ["ionic", "ngCordova", "starter.services"]);

cart-ctrl.js

main.controller('CartCtrl',
  ["$scope", "global",
  function($scope, global) {
  $scope.$on("globalvar", function() {
    //alert("from service cart: " + global.cart.items);
    console.log("from service cart: " + global.cart.items);
    $scope.carts = global.cart.items;
  });
}]);

menu-ctrl.js

main.controller('AppCtrl',
  ["$scope", "$state", "global",
  function($scope, $state, global) {
  $scope.cart_click = function() {
    global.updateCart();
    $state.go('app.cart');
  }
}]);

services.js

var service = angular.module("starter.services", []);
service.factory("global", ["$rootScope", "database", 
  function($rootScope, database) {
  var service = {
    cart: {
        items: [],
        count: 0
    },
    broadcastItem: function() {
      $rootScope.$broadcast("globalvar");
    },
    updateCart: function() {
      database.select_cart(function(p_cart) {
        this.cart.items = p_cart;
        alert("service cart: " + JSON.stringify(this.cart.items));
      });
      this.broadcastItem();
    }
  };
  return service;
}]);

我想要发生的是当我点击标签(触发cart_click())时,购物车列表将重新更新。但是没有值传递到CartCtrl。我想知道这段代码中有什么问题。当我从service.cart.items传递值时,database有一个值。

2 个答案:

答案 0 :(得分:1)

我认为我们有2个选择。

  • 你可以$ scope.cart_click => $ rootScope.cart_click。
  • 您可以$ emit,$ broadcast和$ on

https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

中查看更多内容

答案 1 :(得分:0)

我认为你应该在数据库调用的回调中调用this.broadcastItem();。此外,回调中this的上下文实际上并不是同一服务。将代码更新为

updateCart: function() {
  var self = this;
  database.select_cart(function(p_cart) {
    self.cart.items = p_cart;
    self.broadcastItem();
    alert("service cart: " + JSON.stringify(self.cart.items));
  });
}