如何更新子控制器中的父控制器变量

时间:2014-04-10 00:44:47

标签: dart angular-dart

在父控制器中,像这样:

@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;
    }
  }
}

此代码无法正常工作。

1 个答案:

答案 0 :(得分:1)

有几种可能性。

  • 使用scope.context

    访问父级
    1. MainController中,您将MainController的实例分配给其范围内的命名属性(在其构造函数中)
    2. 您可以使用LoginController 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')注释,您只需创建一个绑定。