基于角度组件的方法和在路由器中的解决方案
Angular component based approach and working with resolve in Router
所以我在角度中使用基于组件的方法,比如说我有一个名为<home></home>;
的指令
import template from './home.html';
import controller from './home.controller.js';
angular.module('myApp')
.directive('home', homeDirective);
let homeDirective = () => {
return {
restrict: 'E',
template,
controller,
controllerAs: 'vm',
bindToController: true
};
};
现在我可以在路由中使用组件<home></home>
,如下所示:
angular.module('myApp')
.config(($routeProvider) => {
$routeProvider.when('/', {
template: '<home></home>'
})
})
我真的很喜欢这种方法,但对于"旧"方法,我习惯于在我的routeconfig中使用"resolve",只有在承诺得到解决时才能呈现组件:
angular.module('myApp')
.config(($routeProvider) => {
$routeProvider.when('/', {
templateUrl: './home.html',
controller: './home.controller.js',
resolve: {
message: function(messageService){
return messageService.getMessage();
}
})
})
问题
如何在角度中使用基于组件的方法进行解析?aaj
有一个悬而未决的问题:支持指令的解析选项。
结论是,他们不希望异步加载任意指令,因为这会导致太多的闪烁。
好消息是Angular 2在DI层以一种内聚的方式支持这一点(以及更多),并且不会引入大量额外的复杂性。
在Angular 1.x中,您可以使用从哪里获取消息的一些信息来赋予指令属性,并在控制器中处理异步加载。这样你也可以显示一些不错的加载程序屏幕。
angular.module('myApp')
.config(($routeProvider) => {
$routeProvider.when('/', {
template: '<home my-datasource="feed1"></home>'
}).when('/other', {
template: '<home my-datasource="feed2"></home>'
})
})
.factory('DataSources', (messageService) => {
return {
feed1: messageService.getMessage,
feed2: messageService.getError
};
});
或者,如果希望message
始终来自同一个源,则可以将messageService.getMessage().then(...)
刻录到控制器中。
如果你不想在promise解析之前看到指令,你可以引入一个范围变量,最初设置为false,然后在解析时设置为true,例如:
app.controller('HomeController', ($scope, messageService) => {
$scope.loaded = false;
messageService.getMessage().then(message => {
...
$scope.loaded = true;
});
...
});
并隐藏该指令,直到在根元素处加载了CCD_。是的,这有点太多的用户代码了,但你至少可以控制一切。
事实证明,有角度的$routeProvider将解析的本地人传递给$routeChangeSuccess事件(nextRoute.locals)。因此,您可以创建一个侦听路由更改并公开本地人的服务:
angular.module('myApp', ['ngRoute'])
.factory('$routeLocals', function($rootScope) {
var locals = {};
$rootScope.$on('$routeChangeSuccess', function(_, newRoute) {
angular.copy(newRoute.locals, locals);
});
return locals;
})
.run(function($routeLocals) {});
然后,您可以将$routeLocals注入到指令中并使用它们。
示例:http://codepen.io/fbcouch/pen/eJYLBe
https://github.com/angular/angular.js/blob/master/src/ngRoute/route.js#L614
在Angular 1.x中,当一些数据从ajax和其他方面到达我的指令绑定('=')时,我在指令中观察这个绑定,我没有正确地呈现指令。我查看了很多stackoverflow主题和博客,以及他们写的关于数据绑定和观看的所有内容,但这对我没有帮助,我亲眼看到,有时指令没有呈现,但数据来了。
在这种情况下,只有指令父控制器中的resolve
可以帮助我,因为在其他情况下,它看起来像是未定义的行为。我根据我的指令登录,数据设置可以,但指令没有呈现!(在简单的情况下,我不会使用ng if或ng show来隐藏它)。
您可以在这里阅读更多
- 可以转换显示属性吗?如果没有,什么'这是最好的解决方案
- iPad虚拟键盘-哪一个-javasctript解决方案
- AJAX HTTP基本身份验证解决方案
- 在chrome web商店中打开时,是否有允许执行内容/后台脚本的解决方案
- Chart.js-添加渐变而不是纯色-实现解决方案
- learnyounode杂耍异步解决方案不工作
- 了解因子分解解决方案
- 提交表单后的最佳解决方案
- 计时器在使用 jQuery 一分钟后没有触发,或者每 1 分钟后给出一些其他解决方案来触发功能
- chrome中的意外全局变量有解决方案吗
- 更好的解决方案HTML元素幻灯片从右侧CSS转换
- 使用SeleniumWebdriver将文本复制到文件时出现编译错误的解决方案
- 如何让我的网站上的WEBP图像加载在morzilla firefox中有一个可能的解决方案吗?如果是,那么如何
- JS驱动的常见问题页面的推荐DB解决方案
- 这里有一个更优雅的/DRY/可维护的JS解决方案
- 什么是农民最实用的解决方案;印刷动物”;
- 根据某些条件验证用户输入,而不是将输入输入到数组中,需要最基本的解决方案
- 将数据加载到地图上的更好解决方案
- React,Flux,React路由器调度错误-可能的批更新解决方案
- 基于角度组件的方法和在路由器中的解决方案