2014-02-14 24 views
2

如何通過使用表達式綁定將獨立作用域的兩個指令向下傳遞給函數?AngularJS中跨越獨立作用域的鏈式表達式綁定

我有父子關係的兩個指令:

app.directive('parentDir', function(){ 
    return { 
     scope:{ 
      parentData:'=', 
      changeRouteParent:'&' 
     }, 
     templateUrl:'mydir/parentTemplate.html' 
    }; 
}); 

app.directive('childDir', function(){ 
    return { 
     scope:{ 
      dirData:'=', 
      changeRoute:'&' 
     }, 
     templateUrl: 'mydir/childTemplate.html' 
    }; 
}); 

在父模板:

<div class="parentDirClass"> 
    <a ng-click="changeRouteParent({newFoo:parentData.url})>fooLink</a> 
    <div child-dir ng-repeat="child in parentData.childData" dir-data="child" change-route="???"></div> 
</div> 

在子模板:

<div class="childDirClass"> 
    <a ng-click="changeRoute=({{newFoo:dirData.url}})">foolink</a> 
</div> 

嘗試使用該指令在一起:

app.controller('exampleController', function($scope, $state){ 
    $scope.changeRoute = function(newFoo) { 
     $state.go(newFoo); 
    }; 
    $scope.theParentData = pData; 
}); 

//parent data 
pdata = {url:'/fooUrl', 
     childData:[{url:'/whatever1'},{url:'/whatever2'}, {url:'/whatever3'}]}; 

HTML:

<div ng-controller="exampleController"> 
<div parent-dir parent-data="pData" change-route-parent="changeRoute(newFoo???)"></div> 
</div> 

隨着表達的一個水平結合的解決方案似乎很容易,你可以很容易地(在兒童指令changeRoute=({{newFoo:dirData.url}}))識別正在傳遞的變量,但再向上移動的水平我沒有變通過。我怎樣才能繼續通過dirData.url上鍊的示例控制器調用changeRoute

回答

3

經過一番擺弄,我發現鏈接可以如下實現 -

當綁定表達式在模板最多獨生子女指令中: childBoundExpression({variableFromChild:variableinIsolatedScope})

然後,從父開始最受孩子指令:

<div childDirective child-bound-expression="parentBoundExpression({variableToParent:variableFromChild}) ></div>

第N父使用上述的表達和重複,直到你到達頂峯的指令/ HTML。最終的variableToParent名稱必須是將被傳遞給函數在你最親的變量$scope

最重要的一點是,如果你從孩子通過相同的變量父variableToParentvariableFromChild必須一樣的名字。