【问题标题】:How to update parent controller variables in child controller如何在子控制器中更新父控制器变量
【发布时间】:2014-04-10 00:44:47
【问题描述】:

在父控制器中,像这样:

@NgController(
  selector: '[main-ctrl]',
  publishAs: 'ctrl')
class MainController {
  Scope scope;
  bool showHeaderFooter=false;
}

在子控制器中,如何更新 showHeaderFooter 变量?

@NgController(
selector: '[login-ctrl]',
publishAs: 'login')
class LoginController {
  Scope scope;
  NgRoutingHelper routingHelper;
  var username, pwd;

  LoginController(this.routingHelper,this.scope);

  void login(){
    if(username!=null&&pwd!=null){
      routingHelper.router.go('welcome', {});
      scope.parentScope.showHeaderFooter=true;
    }
  }
}

此代码无法正常工作。

【问题讨论】:

  • 您介意修改父控制器以使其成为可能还是父控制器不知道这一点?
  • @GünterZöchbauer 在 AngularJs 中,我们可以使用 emit 和 on event 来更改父范围变量,但我不清楚如何在 angular-dart 中实现这一点。
  • 我尝试使用emit 做一个简单的例子。您能否看一下我当前的答案,并添加一些有关您首选方法的信息。
  • @GünterZöchbauer 你的代码没问题,但我不明白 "(scope.parentScope.context['mainCtrl'] as MainController).showHeaderFooter=true;"和“scope.context['mainCtrl'] = this;”您能否为此提供更多信息或文档?
  • 我在答案的顶部添加了一些解释,但我认为使用 emit 是更好的方法。 parentScope 仅在您知道 MainController 实际上是您的直接父作用域时才有效。 emit 适用于所有祖先。

标签: dart angular-dart


【解决方案1】:

有几种可能性。

  • 使用scope.context访问父级

    1. MainController 中,您将MainController 的实例分配给创建时(在其构造函数中)其范围内的命名属性
    2. 您可以使用 from LoginController by scope.parentScope 访问父范围,然后使用分配实例的属性。
  • 使用 emit 的事件,将 MainCntroller 分配给范围属性,然后您可以使用

  • 访问它
@NgController(
  selector: '[main-ctrl]',
  publishAs: 'ctrl')
class MainController {
  Scope scope;
  bool showHeaderFooter=false;
  MainController(this.scope) {

    // approach using emit
    scope.on('login').listen((e) => showHeaderFooter = e.data);

    // approach using scope.context
    scope.context['mainCtrl'] = this;

    // just for demonstration
    new Timer.periodic(new Duration(seconds: 1), (e) => print(showHeaderFooter));
  }

}

@NgController(
selector: '[login-ctrl]',
publishAs: 'login')
class LoginController {
  Scope scope;
  NgRoutingHelper routingHelper;
  var username, pwd;

  LoginController(this.routingHelper,this.scope);

  void login(){
//    if(username!=null&&pwd!=null){
      //routingHelper.router.go('welcome', {});

      // approach using emit
      scope.emit('login', true);

      // approach using scope.context
      (scope.parentScope.context['mainCtrl'] as MainController).showHeaderFooter=true;
//    }
  }
}

或者,如果您 MainController 有一个独特的 publishAs 和一个 @NgTwoWay('showHeaderFooter') 注释,您可以创建一个绑定。

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多