Javascript 使两个州共享一部分决心
我对两个州的定义如下:Javascript 使两个州共享一部分决心,javascript,angularjs,angular-ui-router,nested-routes,nested-views,Javascript,Angularjs,Angular Ui Router,Nested Routes,Nested Views,我对两个州的定义如下: app.config(['$stateProvider', function ($stateProvider) { $stateProvider .state('edit', { url: '/edit/{id}', templateUrl: '/htmls/h1.html', controller: 'SameCtrl', onEnter: ...sa
app.config(['$stateProvider', function ($stateProvider) {
$stateProvider
.state('edit', {
url: '/edit/{id}',
templateUrl: '/htmls/h1.html',
controller: 'SameCtrl',
onEnter: ...sameOnEnter...
resolve: {
...commonResolve...
}
})
.state('addinEdit', {
url: '/addin/edit/{id}',
templateUrl: '/htmls/h2.html',
controller: 'SameCtrl',
onEnter: ...sameOnEnter...
resolve: {
special: [ ... ],
...commonResolve...
}
})
}])
因此,它们共享同一个控制器,同一个
onEnter
,它们有一个非常长的和resolve
的公共部分(这实际上是一个解析链:第一:函数(…){…},第二:函数(…){…},
)。有谁知道如何重写它们,这样我就不必写两次commonResolve
?我没有angularjs的经验,但我找到了一个解决方案,
可以通过parent属性指定状态的父级
app.config(['$stateProvider', function ($stateProvider) {
$stateProvider
.state('edit', {
url: '/edit/{id}',
templateUrl: '/htmls/h1.html',
controller: 'SameCtrl',
onEnter: ...sameOnEnter...
resolve: {
...commonResolve...
}
})
.state('addinEdit', {
url: '/addin/edit/{id}',
templateUrl: '/htmls/h2.html',
parent : 'edit'
})
}])
只需为解析器创建一个函数:
app.config(['$stateProvider', function ($stateProvider) {
resolverFunction.$inject = ['resolverA', 'resolverB'];
function ResolverFunction(myService1, myService2) {
return 'something';
}
resolverAFunction.$inject = ['resolverC'];
function resolverAFunction(resolverC) {
return 'anything';
}
resolverBFunction.$inject = ['resolverC'];
function resolverBFunction(resolverC) {
return 'something else';
}
resolverCFunction.$inject = ['service'];
function resolverCFunction(service) {
return 'something else';
}
$stateProvider
.state('edit', {
url: '/edit/{id}',
templateUrl: '/htmls/h1.html',
controller: 'SameCtrl',
onEnter: ...sameOnEnter...
resolve: {
commonResolver: resolverFunction,
resolverA: resolverAFunction,
resolverB: resolverBFunction,
resolverC: resolverCFunction,
}
})
.state('addinEdit', {
url: '/addin/edit/{id}',
templateUrl: '/htmls/h2.html',
controller: 'SameCtrl',
onEnter: ...sameOnEnter...
resolve: {
special: [ ... ],
commonResolver: resolverFunction,
resolverA: resolverAFunction,
resolverB: resolverBFunction,
resolverC: resolverCFunction,
}
})
}])
如果它们很长,那么您可以编写commonResolve以成为一个私有函数吗?@tiepnv您可以解释更多吗?我在哪里可以定义这样的私有函数?我们将解析置于“编辑”状态,并将“addinEdit”状态从“编辑”继承。抱歉,我不清楚一件事。。。实际上,
commonResolver
包含一个解析器链(这就是为什么它很长)。它看起来像first:function(…){…},second:function(…){…},
。有没有办法将所有这些都封装在一个函数中?是的,只需为每个解析器创建函数,然后在需要的地方注入它们。因此,我们不能只为链创建一个函数?如果您只想为链创建一个函数,您可能需要以父/子的方式创建状态,以便将冲突解决程序从父级注入子级。