离开子状态时,将数据从子状态传递到父状态

时间:2014-10-24 08:13:14

标签: javascript angularjs angular-ui-router

我已经在网上搜索了解决这个问题的方法,但无法找到最佳解决方案。不同的方法涉及在状态,自定义data或父services上使用$scopes,但似乎没有任何内容适用于此处。

我有一个带有一些对象或变量的父控制器,从这个状态我可以进入子状态,我想在父状态中更新变量并返回到父状态。代码将更好地解释它。

function parentController($state) {
    var vm = this;
    vm.myVal = 1;
}

function childController($state) {
    var vm = this;

    vm.changeValue = function () {
        //TODO: change value of myVal in parent so it updates on view
        //if possible allow also updating or passing whole objects to parent
        return $state.go('parent');

        //is it possible to pass anything to reloaded state?
        //return $state.go('parent', {}, {reload:true})
    }
}

可以使用完整的工作代码here on Plunker

我对AngularJS很陌生,所以我可能会遇到根本性的错误,而且代码需要重新编写来实现这一点。我宁愿保留controller as语法。

最好的方法是什么?如果可以,请将Plunker用工作溶液分叉。

1 个答案:

答案 0 :(得分:0)

这是父母/孩子之间沟通的一个例子。控制器使用Angular的$ scope的分层行为。 ($ scope在角度方面很特别!)

function parentController($scope) {
  var self = this;

  this.myVal = 1;
  this.myMessage = "Starting message";

  // set up method that child controllers can call.
  $scope.signalParent = function(data) {
    console.log("Parent signalled with " + JSON.stringify(data));
      self.myVal++;
      self.myMessage = data.msg;
      if (!$scope.$$phase) {
          $scope.$apply();
      }
  };
}

function childController($scope) {
  var self = this;
  this.changeValue = function() {
     // call the method from the parent.
    $scope.signalParent({msg: "Hello " + Math.random(100)});
  };
}
})();

Plunkr:plnkr.co/edit/1yhFAcGq7nUS37VtpAlr?p=preview

父控制器设置$ scope" signalParent"财产是一种功能。任何较低级别的控制器都将继承' $ scope因此可以调用signalParent()方法。

我必须说,直接在控制器之间进行通信被认为是不正确的。据我所知。 "事件处理" &安培; "信号"是首选。