3

한 모델을 사용하여 세 가지 변수를 편집하는 방법이 있습니까? 현재 접근법에서는 변수 값이 "editedVar"에 복사되는 것처럼 보입니다.단일 모델을 사용하여 여러 변수 편집

Fiddle of the code below

<div ng-controller="MyCtrl"> 
    A: {{A}}<br/> B: {{B}} <br/> C: {{C}}<br/> 
    <input ng-model="editedVar"/> 
    <br/> 
    <button ng-click="switchToA()">Switch to A</button> 
    <button ng-click="switchToB()">Switch to B</button> 
    <button ng-click="switchToC()">Switch to C</button> 
</div> 




var myApp = angular.module('myApp',[]); 

function MyCtrl($scope) { 
$scope.A = 1; 
$scope.B = 2; 
$scope.C = 3; 

    $scope.switchToA = function() 
    { 
     $scope.editedVar = $scope.A;  
    }; 

    $scope.switchToB = function() 
    { 
     $scope.editedVar = $scope.B;  
    }; 

    $scope.switchToC = function() 
    { 
     $scope.editedVar = $scope.C;  
    }; 
} 
+0

당신이 할하려는 거죠? editedVar를 A, B 또는 C 값으로 설정 하시겠습니까? angular.copy는 값 유형에 대해 필요하지 않습니다 –

+0

해당 복사본에 대해 죄송합니다. 제거하는 것을 잊어 버렸습니다. 방금 제거했습니다. editedVar 바인드 된 입력을 사용하여 A B C 값을 변경하려고합니다. 그게 가능하니? 입력 값의 변경은 클릭 된 A B 또는 C의 값을 수정해야합니다. – SamSamet

+0

질문을 업데이트 할 수 있습니까? 그래서 jjust가 명확 해 지도록 버튼에 A, B & C를 editedVar의 값으로 설정하기를 원하십니까? 3 버튼이있는 이유는 무엇입니까? –

답변

3

당신은 여러 가지 방법으로 그것을 할 수 여기에 간단하고 더 Dry'ier의 방법입니다.

보기 (그냥 현재 편집 VAR를 변경하는 간단한 하나의 기능을 유지) : -

<input ng-model="editedVar[editing]" /> 
<br /> 
<button ng-click="switchTo('A')">Switch to A</button> 
<button ng-click="switchTo('B')">Switch to B</button> 
<button ng-click="switchTo('C')">Switch to C</button> 

컨트롤러 : - 당신도 할 수

function MyCtrl($scope) { 
    /*Keep the values in an object with respective property name*/ 
    $scope.editedVar = { 
     A: 1, 
     B: 2, 
     C: 3 
    } 

    /*Set the default edit property*/ 
    $scope.editing = 'A'; 

    /*Sets the currently edited property based on what is being passed in*/  
    $scope.switchTo = function (prop) { 
     $scope.editing = prop; 
    }; 

} 

Fiddle

개체를 사용하지 않고도 유지 관리 코드 만 있으면됩니다.

보기 : -

<input ng-model="editedVar" ng-change="valueChange()"/> 
<br/> 
<button ng-click="switchTo('A')">Switch to A</button> 
<button ng-click="switchTo('B')">Switch to B</button> 
<button ng-click="switchTo('C')">Switch to C</button> 

컨트롤러 : - 당신이 원하는 것은하지 원시 형에 의해 참조 결합 양방향이

function MyCtrl($scope) { 

    $scope.A = 1; 
    $scope.B = 2; 
    $scope.C = 3; 

    var editing; 
    /*Change event to keep the value in sync*/ 
    $scope.valueChange = function(){ 
     $scope[editing] = $scope.editedVar; 
    } 
    /*Just one function*/ 
    $scope.switchTo = function (prop) { 
     $scope.editedVar = $scope[editing = prop]; 
    }; 

} 

Fiddle

+0

이것은 올바른 사용법입니다. 그러나 객체 구조없이이 작업을 수행 할 수있는 방법이 있습니다. 제 예제처럼 서로 할당하는 것만 큼? – SamSamet

+0

@SamSamet 예, 가능하다면 상태를 유지하기 위해 더 많은 코드와 코드를 유지할 수 없습니다. 그런 식으로해야하는 이유는 무엇입니까? – PSL

+0

나는 수백 개의 행을 가진 테이블을 가지고 있는데, 행을 클릭하면 값을 편집 할 수있는 모달이 나타납니다. 편집 모달이 한 번 생성 된 다음이 방법을 사용하여 편집 할 행 개체를 할당해야합니다. – SamSamet

1

, 아래 참조 :

<div ng-controller="MyCtrl"> 
    A: {{A.val}}<br/> B: {{B.val}} <br/> C: {{C.val}}<br/> 
    <input ng-model="editedVar.val"/> 
    <br/> 
    <button ng-click="switchToA()">Swithc to A</button> 
    <button ng-click="switchToB()">Swithc to B</button> 
    <button ng-click="switchToC()">Swithc to C</button> 
</div> 



var myApp = angular.module('myApp',[]); 

function MyCtrl($scope) { 
    $scope.A = {val: 1}; 
    $scope.B = {val: 2}; 
    $scope.C = {val: 3}; 

    $scope.switchToA = function() 
    { 
     $scope.editedVar = $scope.A;  
    }; 

    $scope.switchToB = function() 
    { 
     $scope.editedVar = $scope.B;  
    }; 

    $scope.switchToC = function() 
    { 
     $scope.editedVar = $scope.C;  
    }; 
} 
+0

OP에 100 가지의 이러한 속성이 있다면 말해야 할 것입니다. 그 경우에는 – PSL

+0

이 분명히 배열을 반복합니다. – elaijuh

+0

예 또는 배열 색인을 기반으로 관리하는 것보다 훨씬 명시적일 수있는 객체가 훨씬 더 쉬울 것입니다. (IMHO – PSL

1

@ PSL의 대답의 한 가지 한계는 다른 코드가 A, B 또는 C의 값을 범위에서 변경하면 $scope.editedVar이 올바르게 업데이트되지 않는다는 것입니다. 대신 다음 두 가지 방법을 사용하여 두 개의 시계를 사용하여 올바른 범위 속성이 입력에서 editedVar을 사용하여 변경했거나 다른 코드를 통해 변경했는지 여부를 최신으로 유지합니다.

Forked jsFiddle

var myApp = angular.module('myApp', []); 
 

 
myApp.controller('MyCtrl', function MyCtrl($scope) { 
 
    $scope.A = 1; 
 
    $scope.B = 2; 
 
    $scope.C = 3; 
 

 
    var propToEdit, 
 
    deregPrevWatch; 
 

 
    $scope.switchTo = function(prop) { 
 
    propToEdit = prop; 
 
    // set up a watch on this property so if anything else updates it 
 
    // editedVar gets correctly updated. 
 
    // Make sure to deregister the previous watch first. 
 
    if (deregPrevWatch) 
 
     deregPrevWatch(); 
 
    deregPrevWatch = $scope.$watch(prop, function(val) { 
 
     $scope.editedVar = val; 
 
    }); 
 
    }; 
 

 
    $scope.$watch('editedVar', function(newVal, oldVal) { 
 
    // skip the initialisation step 
 
    if (newVal !== oldVal) 
 
     $scope[propToEdit] = newVal; 
 
    }); 
 

 
    // start off pointing at A 
 
    $scope.switchTo('A'); 
 
});
p { 
 
    margin: 2px 0; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.7/angular.min.js"></script> 
 

 
<div ng-app="myApp"> 
 
    <div ng-controller="MyCtrl"> 
 
    <p>A: {{A}}</p> 
 
    <p>B: {{B}}</p> 
 
    <p>C: {{C}}</p> 
 
    <input ng-model="editedVar" /> 
 
    <p> 
 
     <button ng-click="switchTo('A')">Switch to A</button> 
 
     <button ng-click="switchTo('B')">Switch to B</button> 
 
     <button ng-click="switchTo('C')">Switch to C</button> 
 
     <button ng-click="A = 5">Set A to 5</button> 
 
    </p> 
 
    </div> 
 
</div>

+0

# 1 나는 절대적으로 필요한 경우를 제외하고는 시계를 만드는 것을 싫어합니다. # 2 다른 코드가 A, B 또는 C의 값을 변경한다는 것은 무엇을 의미합니까? 당신은 동적으로 예를 바르게 변경하지만 OP가 말한 것을 기반으로합니다. '나는 수백 개의 행을 가진 테이블을 가지고 있고 행이 클릭되었을 때 값을 편집 할 수있는 모달을 만들었습니다. 저는 이것을 필요로하지 않는 인라인 편집 기능과 비슷하다고 말합니다. 그러나 이것은 필자의 초기 접근법에 대한 좋은 개선이다. – PSL

+0

# 1 시계를 만드는 것을 피하는 것은 컨트롤러 코드에서 좋은 본능이지만 Angular는 많은 시계를 만듭니다. 그리고 이전 시계를 등록 취소하여 항상 두 시계 만 가지고있는 것을 조심했습니다. # 2 A를 5로 설정하려면 내 버튼의 예를 참조하십시오. "A로 설정"하는 동안 해당 버튼을 클릭하면 입력이 업데이트되어야합니다. 편집중인 속성에서 시계를 설정 한 경우에만 작동합니다. – GregL

+0

물론 나는 당신이하고있는 것을 알고 있지만, 꼭 필요한 경우를 제외하고는 ... 결코 OP를 알지 못할 수도 있습니다. 원래의 경우에는 더 좋은 디자인이 될 수도 있습니다. – PSL