2013-03-30 3 views
16

범위 속성을 설정해야하는 ng-repeater 내에 지시문이 있습니다. 여기에 바이올린을 참조하십시오 http://jsfiddle.net/paos/CSbRB/ 문제는 범위 속성과 같은 속성 값으로 부여되는자식 범위에서 지시어에서 각도 컨트롤러 개체 속성 값을 설정하는 방법

: inputdata.title 일부 문자열이 지침은 범위 속성을 설정하도록되어

<button ng-update1="inputdata.title">click me</button> 

. 이 작동하지 않습니다

app.directive('ngUpdate1', function() { 
    return function(scope, element, attrs) { 
     element.bind('click', function() { 
      scope.$apply(function() { 
       scope[ attrs.ngUpdate1 ] = "Button 1"; 
      }); 
     }); 
    }; 
}); 

그러나 직접 할당하여 작동합니다

scope["inputdata"]["title"] = "Button 1"; 

당신은 내가 가진 범위 속성을 설정하는 방법을 말해 주시겠습니까. 그것의 이름에서 표기법에 표기법?

추신 : 피들이 리피터를 사용하는 이유는 지시어를 하위 범위에 포함시키기 때문입니다. 자식 범위에 있으면 프리미티브 인 범위 속성에 쓸 수 없습니다. 그래서 "."과 함께 객체 속성이 필요합니다. 이름으로. 여기에 긴 설명을 참조하십시오 What are the nuances of scope prototypal/prototypical inheritance in AngularJS?

감사합니다

+0

세련되지 솔루션이 될 것 $의 apply', 예를 들어'의 캐릭터 라인 형식 사용 :.'범위를 적용 $ (attrs.ngUpdate1 + '='+ ' "버튼 1"');'. –

+0

@ Josh, 내 대답을 볼 수 없었던 경우를 대비해 우아한 해결책은'$ parse'를 사용하는 것입니다. –

답변

35

$parse 귀하의 문제를 해결할 것입니다.

<button ng-update1="inputdata.title"> 
app.directive('ngUpdate1', function($parse) { 
    return function(scope, element, attrs) { 
     var model = $parse(attrs.ngUpdate1); 
     console.log(model(scope)); // logs "test" 
     element.bind('click', function() { 
      model.assign(scope, "Button 1"); 
      scope.$apply(); 
     }); 
    }; 
}); 

Fiddle

지시어가 분리 범위를 사용하지 않고, 당신이 속성을 사용하여 범위 속성을 지정하고이 값을 수정할 때마다, $parse를 사용합니다.당신이 값을 수정하지 않는 경우

대신 $eval를 사용할 수 있습니다

console.log(scope.$eval(attrs.ngUpdate1)); 
+0

오른쪽 위에 있습니다. 감사! – user681814

+0

ng-model을 html 속성으로 사용하는 대신 html 요소가 지시어이고 여기에 링크로 표현한 코드가 있다고 가정합니다. 사용자 정의 함수 대신 ng-model을 사용하면됩니까? – sonicblis

+0

@sonicblis, 나는 아주 다른 시나리오에 대해 묻기 때문에 바이올린으로 새로운 질문을 게시하는 것이 좋습니다. 응답은 지시문이 사용하는 범위 유형에 따라 달라집니다. 이 도움이 될 수도 있습니다 : http://stackoverflow.com/questions/11896732/ngmodel-and-component-with-isolated-scope –

2

하나의 방법은 2 속성, 대상 개체에 대한 하나의 해당 객체의 속성에 대한 다른 만드는 것입니다 뿐이다 전반적인 것을 목적 확실하지 :

<button ng-update1 obj="inputdata" prop="title"> 
app.directive('ngUpdate1', function() { 
    return function(scope, element, attrs) { 
     element.bind('click', function() { 
      scope.$apply(function() {     
       scope[ attrs.obj ][attrs.prop] = "Button 1";    

      }); 
     }); 
    }; 
}); 

DEMO : http://jsfiddle.net/CSbRB/9/

은 또한 당신이 split() 발을 수 기존의 형식을 사용하여 두 가지 접근 방식과 표기법 객체와 속성에 대한 현재 ng-update1 속성과 사용 결과 배열의 UE는

element.bind('click', function() { 
      var target=attrs.ngUpdate1.split('.'); 
      scope.$apply(function() {     
       scope[ target[0] ][target[1]] = "Button 1";    

      }); 
     }); 

DEMO : 당신이 지침에 고립 된 범위를 만들와 기준에 통과 할 수 http://jsfiddle.net/CSbRB/10/

또 하나의 방법 행 inputdata 객체와 속성에서 속성 이름을 당기 (제 2 판과 동일한 태그)

app.directive('ngUpdate3', function() { 
    return { 
     scope: { 
      targetObject: '=obj' 
     }, 
     link: function (scope, element, attrs) { 
      element.bind('click', function() { 
       scope.$apply(function() { 
        scope.targetObject[attrs.prop]='Button 3'; 

       }); 
      }); 
     } 
    } 
}); 

http://jsfiddle.net/CSbRB/11/

01,
+0

두 개의 속성이나'split()'대신에'$ parse'를 대신 사용하십시오 (제 답변을보십시오). 또한, 분리 스코프를 사용하면 다음과 같은 지시문에서 '

+0

@ MarkRajcok 감사합니다 .. 이전에 고립 된 범위에서 속성에 바인딩하려고했는데 왜 작동하지 않았는지 모르겠다. $ parse에 대한 문서는 끔찍하다. ... 귀하의 의견이 도움이됩니다. '$ parse'를 사용하고 나서'assign'을 사용할 필요가있는 것보다 더 직관적 인 접근이 필요합니다. – charlietfl

+0

나는 당신의 바이올린에서도 고립 된 영역의 속성에 바인딩하는 데 문제가있었습니다. 문제는 피날레의 Angular (1.0.0) 이전 버전입니다. –

관련 문제