2014-12-04 4 views
2

사용자 지정 지시문이 있습니다. tableDisplay라고 부르 자고합니다. 속성을 기반으로 열을 표시하거나 숨길 수 있기를 원합니다 (우리가 작업하고있는 show-edit-column이라고 부름). 그러나 각 행에서 주어진 행을 편집 할 수 있습니다. 각 행이 편집 가능 여부를 결정하는 데 사용해야하는 조건문을 알려주는 또 다른 속성 (allow-edit-row-condition)을 전달하여이 작업을 수행하려고합니다.AngularJS - 지시문에 조건 전달

다음과 같은 메시지가 표시됩니다.

<table-display show-edit-column="true" allow-edit-row-condition="row.value === 'OK'"> 

난 그냥 다음 각 행에 사용할 수있는 방법으로 row.value === 'OK'를 전달하는 방법을 모르겠어요. 어떤 아이디어/제안?

+0

ng-repeat를 사용하여 행을 만들면 각 반복 요소에 allow-edit-row-condition 속성을 추가합니까? –

+1

문제점은 allow-edit-row-condition이 table-display 지시어가 사용되는 페이지에 따라 변경 될 수 있으므로 사용자 정의 할 수 있어야합니다. – woolyninja

+0

'row.value' 란 무엇입니까? 지시문의 부모 범위에'row'가 정의되어 있습니까? –

답변

2

함수를 통과 설명하기 위해 plunker입니다.

... 
allowEditRowCondition: '&' 
... 

을 그리고 당신의 지시 템플릿에 지금

<table-display show-edit-column="true" 
       allow-edit-row-condition="isEditAllowedForRow(row)"> 

로 사용 : 부모 범위에

단방향 바인딩으로

$scope.isEditAllowedForRow = function (row) { 
    return (row.value === 'OK'); 
}; 

지침 범위 매개 변수가 선언 된 정의 조건을

과 같이 사용할 수 있습니다.
allowEditRowCondition({row: row}) 

예 :

<tr ng-show="allowEditRowCondition({row: row})"> 

자바 스크립트에서는 항상 기능에 대해 생각합니다.

+0

이제 지시문은 내부에서 작동하는 함수로 범위를 오염시켜야합니다. 가장 좋은 방법은 아닌 것 같습니다. –

+0

술탄 - 고마워요! 지금 시도해보기. 새로운 개발자 - 다른 사람이 지금은 나쁘고 최악의 경우에만 혼자서 사용된다는 것이 장점입니다. – woolyninja

1

나는이 질문을 이해합니다. 내부 ng-repeat 컨텍스트에서 평가할 수있는 조건의 텍스트 식을 전달하려고합니다. 왜냐하면 row은 부모 범위 (즉, 지침의 소비자)에서 의미가 없으므로 이제 고객이 내부 지시문 구조를 이해해야하기 때문에 반대하는 것이 좋습니다.

하지만 당신은 고집 ...

당신은 각 행의 맥락에서이 표현을 보간해야 할 것입니다. 따라서 표현식을 내부 범위에서 노출 될 함수로 구문 분석하십시오. 일부 조건 렌더링 (편집 대되지 않음)

<tr ng-repeat="row in src | filter:matchRow"> 
    <td ng-repeat="col in row">{{col}}</td> 
</tr> 

을 또는 수행 :

link: function(scope, elem, attrs){ 
    // get the condition as string 
    var cond = attrs["condition"]; 

    // parse to create a function 
    var matcher = $parse(cond); 

    scope.matchRow = function(row){ 
    // evaluate the function in the context of the row 
    return matcher({row: row}); 
    }; 

그런 다음보기에서이 조건을 기준으로 필터링 할 수 : 당신은 당신의 링크 기능에서이 작업을 수행 할 수 있습니다

<tr ng-repeat="row in src"> 
    <td ng-repeat="col in row"> 
    <input ng-disabled="!matchRow(row)" ng-model="col" class="form-control"> 
    </td> 
</tr> 

여기

관련 문제