在父控制器中,像这样:
@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;
}
}
}
此代码无法正常工作。
答案 0 :(得分:1)
有几种可能性。
使用scope.context
MainController
中,您将MainController
的实例分配给其范围内的命名属性(在其构造函数中)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')
注释,您只需创建一个绑定。