2017-09-24 13 views
0

각도 1.5.x의 구성 요소를 사용하기 시작했으며 양식의 선택 상자에 하나를 생성했습니다. 필드, 목록 및 레이블을 구성 요소에 추가하고 올바른 옵션으로 레이블과 선택 상자로 구성된 '부분'양식을 작성합니다. - 지금까지는 그렇게 좋았습니다.이전 응답을 트리거하는 구성 요소의 선택 요소에 각도 1.5 ng 변경

이제는 select에서 ng-change를 구현하고 싶습니다. 그래서이 함수에 전달하고 싶습니다. 내가 가진 문제는 함수가 새로운 값이 아닌 이전 값으로 트리거된다는 것입니다. 함수가 실제로 변경되기 전에 트리거되는 것을 볼 수 있습니다. 변경 기능을 구성 요소 변경 이벤트 내에 넣으면 올바르게 등록되지만 전달 된 기능은 사용하지 않습니다.

는 나는 내가 뭔가를 간단 말이냐 생각 https://jsfiddle.net/7gd3m2k0/

<div ng-app="demoApp"> 
    <div ng-controller="RoleController as ctrl"> 
    <nac-select  
     field="ctrl.MemberRole.record.member" 
     list="ctrl.Lists.Member" 
     label="Member" 
     on-change="ctrl.MemberRole.changeMember();"></nac-select> 
    <div ng-bind="ctrl.MemberRole.record.member.name"></div> 
    </div> 
</div> 

angular.module('demoApp', []) 
.component('nacSelect', nacSelect) 
.controller('RoleController', roleController) 

var nacSelect = { 
bindings: { 
      field: '=', 
      list: '<', 
      label: '@label', 
      onChange: '&' 
     }, 
     controller: function() { 
      var ctrl = this; 
      ctrl.change = function() {      
       alert(ctrl.field.name); //gives new selection 
       ctrl.onChange(); //gives previous selection 
      } 
     }, 
    template: ` 

    <label>{{$ctrl.label}}</label> 
    <select ng-model="$ctrl.field" ng-options="r as r.name for r in $ctrl.list" ng-change="$ctrl.change();"> 
     <option value="">(Please Select)</option> 
    </select> 
` 
}; 

var roleController = function(){ 
var ctrl = this; 

    ctrl.Lists = { 
Member: [ 
    {id: 1, name: 'Fred Smith'}, 
    {id: 2, name: 'Jenny Jones'}, 
    {id: 3, name: 'Jane Doe'} 
] 
    }; 

ctrl.MemberRole = { 
record: { 
    member: null 
}, 
    changeMember: function(){ 
    alert(ctrl.MemberRole.record.member.name);  
    } 
    }; 
}; 

에서 컷 다운 바이올린을 만들었습니다,하지만 난 그것을 알아낼 수 없습니다. 당신은 첫 번째 컨트롤러에 경고 할 변수에 전달해야 당신의 도움

답변

0

주셔서 감사합니다,이를 확인 :

https://jsfiddle.net/pegla/7gd3m2k0/1/

그래서 함수가 다음과 같을 것이다 :

changeMember: function(name){ 
     alert(name); 
    } 

사용중인 NAC를-선택

<nac-select field="ctrl.MemberRole.record.member" list="ctrl.Lists.Member" label="Member" on-change="ctrl.MemberRole.changeMember(name);"></nac-select> 

과 NAC-선택에서 결국 :

<select ng-model="$ctrl.field" ng-options="r as r.name for r in $ctrl.list | orderBy: 'name'" ng-required="$ctrl.req" ng-if="!$ctrl.list.processing" ng-change="$ctrl.onChange($ctrl.field)"> 

또는 개체에 전달하려면 :

<nac-select field="ctrl.MemberRole.record.member" list="ctrl.Lists.Member" label="Member" on-change="ctrl.MemberRole.changeMember({id, name});"></nac-select> 

은 다음 changeMember은 다음과 같이 할 수 있습니다

changeMember: function(obj){ 
     alert(`${obj.name} ${obj.id}`); 
    } 

새로운 피들 : https://jsfiddle.net/pegla/7gd3m2k0/2/

+0

감사합니다.하지만 전체 개체를 전달하려면 어떻게합니까? 구성원과 역할의 두 가지 객체가 있습니다. 주 컨트롤러의 기능은 기본적으로 : if (멤버가 object이고 role이 object 인 경우) 다음 몇 가지 검사를 수행합니다. 그래서 그 함수에서 모델의 값을 사용하려고했습니다. –

+0

그것은 객체를 전달하고, 업데이트 된 답변을 확인하는 것과 동일합니다. 또한 이것이 작동 할지라도 당신의 접근 방식을 다시 생각해보아야 만합니다. 만약 당신이 컴포넌트 기반 아키텍처로 시작했다면, 부모 컴포넌트에서 2 웨이 바인딩을 사용해서는 안됩니다. 전체 목적은 구성 요소를 작고 재사용 할 수 있도록 분리하는 것입니다. 나는 이것, 정말로 최고의 튜토리얼을 구성 요소 기반의 아키텍처에 대한 온라인 : https://github.com/toddmotto/angularjs-styleguide – pegla

+0

대단히 감사합니다 - 나는 단지 https의 결과로 개체를 보내는 것을 알아 냈다 : /stackoverflow.com/questions/18378520/angularjs-pass-function-to- directive. 내가 선택을 변경하면 원하는 기능을 전달하여 구성 요소를 작고 재사용 할 수 있다고 생각했기 때문에 귀하의 제안을 읽을 것입니다 :). –