2
解决时缺乏承诺的解包的

我有几个嵌套的指令:如何编写嵌套指令

<first-directive> 
    <second-directive user="user"> 
    <third-directive name="name"> 
     <fourth-directive description="description"> 

第一指令的模板有第二个指令,第二指令模板具有第三指令等等。所有指令都有独立的作用域。

第一个指令将自己的范围设置为user对象。如果它以同步的方式执行($scope.user = {name: "Alice"},那么一切都很好,但是,如果以异步方式加载用户(例如$http.get(url).then(function (user) { $scope.user = user }),则所有其他指令都不起作用,因为例如当第二个指令的控制器函数评估,user尚未设置尚未就其范围。

我到目前为止发现的唯一的解决方案是使用在所有嵌套的承诺$scope.$watch(如$scope.$watch("user", function (user) { $scope.name = user.name}第二承诺),它吸了很多,因为如果我想使用指令,我已经使用<first-directive>内的其他地方,我需要重写它以使用$scope.$watch以及...

有没有其他方法可以解决它?我知道我可以加载第一条指令所需的数据,例如在resolve函数的路由它的使用,但我希望能够把这个指令在任何页面,而无需修改任何路由或控制器。

+0

为什么不解决用户在路线而不是在控制器中获取用户? – cbass 2014-10-18 20:14:14

+0

我正在抓取指令的控制器中的对象,而不是路由的控制器。我想创建一个可以放在任何页面上的独立组件,它会自行获取它需要的数据。如果没有办法让它在没有添加$ scope的情况下工作,$ watch到处都是,我最终可能会在组件被使用的路由中获取数据,但是如果可能的话,我想避免它。 – szimek 2014-10-18 20:34:54

回答

4

不是100%肯定它符合你的使用情况,但如果第一个指令总是加载用户异步它可以使用ng-if在它的模板:

template: '<second-directive ng-if="user" user="user"></second-directive>' 

这样,第二个指令将不会被编译,直到用户实际上是可用的(第三或第四指令也不会)。

这也可以使用链中的其他指令而不必添加$watch

如果您需要在用户已有的其他地方使用第二个指令,则可以在不使用ng-if的情况下使用它。