代码之家  ›  专栏  ›  技术社区  ›  Mandy Hodges

触发先前响应的组件中选择元件的角度1.5 ng变化

  •  0
  • Mandy Hodges  · 技术社区  · 7 年前

    我刚刚开始玩Angular 1.5中的组件。x和为表单上的选择框创建了一个-我将字段、列表和标签传递给组件,它创建了表单“部分”,包括标签和具有正确选项的选择框-到目前为止,很好。

    现在我想在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);    
        }  
      };
    };
    

    我想我错过了一些简单的东西,但我想不出来。谢谢你的帮助

    1 回复  |  直到 7 年前
        1
  •  1
  •   pegla    7 年前

    您需要在第一个控制器中传入要发出警报的变量,请选中此项:

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

    因此,您的函数如下所示:

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

    当您使用nac select时

     <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/