在加载 Angular 控制器数据之前不触发数据绑定
Not Trigger Data-Binding until Angular Controller data is loaded
我正在尝试遵循 John Papa 的 Controller Activation Process,其中控制器需要的数据是在控制器的构造函数中加载的。但是,由于 Angular 在加载数据之前尝试绑定到 null
对象,我的页面触发了很多错误。
例子
控制器初始化并执行 AJAX 调用以获取有关电影的信息。同时,HTML 尝试加载有关电影导演的信息。
Controller.js
class MovieController {
constructor(movieHttp) {
this.movieHttp = movieHttp;
this.movie = null;
activate();
}
activate() {
this.movieHttp.getMovie(...).then(movieData => { this.movie = movieData; });
}
}
index.html
...
<span ng-bind="vm.movie.actor.name"></span>
...
除了将 ng-bind
更改为函数调用,然后执行 if (!this.movie) { return; }
之外,是否有解决此问题的好方法?
您可以在 ctrl 上设置一个空的电影对象(或者更好的是服务),并在 ajax 调用 returns 时更新它:
class MovieController {
constructor(movieHttp) {
this.movieHttp = movieHttp;
this.movieData = {
movie: {
actor: {
name: ''
},
title: ''
}
};
activate();
}
activate() {
this.movieHttp.getMovie(...).then(movieData => { this.movieData.movie = movieData;})
}
}
和你的html:
<span ng-bind="vm.movieData.movie.actor.name"></span>
如果对象非常复杂,但是您只设置一次,那么您就可以很容易地弄清楚返回的对象结构是什么(同样,存储它的更好地方是服务)。
另一个解决方案是使用路由器 resolve 属性,它强制在控制器实例化之前 reolved promise(并将解析的对象作为参数注入控制器)
ui-router 有一个方便的方法 (https://github.com/angular-ui/ui-router/wiki), but angular's default router also has this option (https://docs.angularjs.org/api/ngRoute/provider/$routeProvider)
我正在尝试遵循 John Papa 的 Controller Activation Process,其中控制器需要的数据是在控制器的构造函数中加载的。但是,由于 Angular 在加载数据之前尝试绑定到 null
对象,我的页面触发了很多错误。
例子
控制器初始化并执行 AJAX 调用以获取有关电影的信息。同时,HTML 尝试加载有关电影导演的信息。
Controller.js
class MovieController {
constructor(movieHttp) {
this.movieHttp = movieHttp;
this.movie = null;
activate();
}
activate() {
this.movieHttp.getMovie(...).then(movieData => { this.movie = movieData; });
}
}
index.html
...
<span ng-bind="vm.movie.actor.name"></span>
...
除了将 ng-bind
更改为函数调用,然后执行 if (!this.movie) { return; }
之外,是否有解决此问题的好方法?
您可以在 ctrl 上设置一个空的电影对象(或者更好的是服务),并在 ajax 调用 returns 时更新它:
class MovieController {
constructor(movieHttp) {
this.movieHttp = movieHttp;
this.movieData = {
movie: {
actor: {
name: ''
},
title: ''
}
};
activate();
}
activate() {
this.movieHttp.getMovie(...).then(movieData => { this.movieData.movie = movieData;})
}
}
和你的html:
<span ng-bind="vm.movieData.movie.actor.name"></span>
如果对象非常复杂,但是您只设置一次,那么您就可以很容易地弄清楚返回的对象结构是什么(同样,存储它的更好地方是服务)。
另一个解决方案是使用路由器 resolve 属性,它强制在控制器实例化之前 reolved promise(并将解析的对象作为参数注入控制器) ui-router 有一个方便的方法 (https://github.com/angular-ui/ui-router/wiki), but angular's default router also has this option (https://docs.angularjs.org/api/ngRoute/provider/$routeProvider)