Angular Ui-router:ui-views vs指令?
angular度ui路由器允许多个嵌套视图 。 这些可互换的观点的作用似乎与指示的作用重叠。
使用(多重嵌套) ui-view
vs angular的指令有什么优点/缺点?
UPDATE
状态和路由是两个不同的function。 各国允许你换出partial.html模板及其控制器,你可以(可选地)指定相应的URL /路由。
在Tim Kindberg(一个ui-router
dev)的电子邮件回复中:
ui-view是一个指令,所以如果你使用它,你正在使用一个特定的指令来处理ui-router模块的其他部分。 我无法想象它很容易推出自己的指令来取代这个function。
对此,看起来你可以有两个select:
正常指令:
app.directive('myDir1', {/* controller: ... */}) .directive('myDir2', {/* controller: ... */})
vs ui-view“指令”
$stateProvider.state('route1', { /* url: "/route1", // optional?? */ views: { "myDir1": { templateUrl: "myDir1.html" /* , controller: ... */ }, "myDir2": { templateUrl: "myDir2.html" /* , controller: ... */ } } })
奖金问题:
正常的angular度指示function是否可用于视图? 如:
- Transclude
- 更换
- 隔离范围
- 编译/链接function
如果ui-views是指令,看起来他们的用法是不一样的。 协调这些模型没有意义吗?
如果你使用Angular UI路由器的内联视图来指向指令呢?
假设您有一个处理用户帐户CRUD操作的表指令。 我们会说这个指令被命名为user-admin
。 我们的路线文件看起来像这样:
.state('users', { url: '/users', template: "<user-admin>" });
这会给你很多好东西:
- 允许你有一个指向直接指向的URL
- 删除需要两个模板(查看模板和指令模板)时的状态只是一个指令的重复
- 允许您开始将更多的控制器逻辑转换为适用于Angular 2.0的指令。 看到这里和这里 。
经过一番思考/对应,这是我的结论:
ui-views定义容器,状态定义这些容器中的内容
当你在一个元素上放置一个ui-view='containerName'
指令时,你正在设置一个容器。 你还没有说什么在那里。
当你创build你的$stateProvider.state(...)
定义时,你需要指定这些容器中的内容:
$stateProvider.state('someState', { views: { "containerName": { templateUrl: "someContents.html" /* , controller: ... */ }, "container2": { templateUrl: "otherContents.html" /* , controller: ... */ } } })
你可以使用所有的传统指令function(transclude,replace,隔离范围,编译/链接function)与你的用户界面? 我不确定。 例如:
$stateProvider.state('someState', { views: { "containerName": { templateUrl: "someContents.html", scope: { localVar: "@" }, // can you transclude: true, // do this? controller: function(){} }, "container2": { templateUrl: "otherContents.html" /* , controller: ... */ } } })
总之,似乎每个选项都有其折衷。 指令有一些额外的function,但UI视图是可互换的,可以有相关的路线。
看来你可以这样做,相对不受惩罚:
$stateProvider.state('general', { url: '/general', views: { main: { template: '<general-directive></general-directive>' } } });
**In Config function:** .state('list', { url:'/list', template:'<user-info-table></user-info-table>', controller:'UserInfoTableController', }); **In Directive:** angular.module('UserInfo').directive("userInfoTable", function() { return { templateUrl:'templates/UserInfoTable.html', restrict:'EA', }; });