Angular cast选择值为int

时间:2016-09-13 15:48:48

标签: forms angular casting

我有一个不同选择的表单,如:

public  class ModuleViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    ItemClickListener itemClickListener;
    public final ImageButton Actions;
    public final ImageView Image;
    public final  TextView ModuleCode;
    public final  TextView ModuleDescription;
    public final  TextView ModuleDate;
    public String ModuleIds;

    public ModuleViewHolder(View itemView) {
        super(itemView);
        Image = (ImageView)itemView.findViewById(R.id.logo);
        Actions = (ImageButton)itemView.findViewById(R.id.Actions);
        //TitleModuleCode = (TextView)itemView.findViewById(R.id.TitleModuleCode);
        ModuleCode = (TextView)itemView.findViewById(R.id.ModuleCode);
        //TitleModuleDescription = (TextView)itemView.findViewById(R.id.TitleModuleDescription);
        ModuleDescription  = (TextView)itemView.findViewById(R.id.ModuleDescription);
        ModuleDate  = (TextView)itemView.findViewById(R.id.ModuleDate);
        itemView.setOnClickListener(this);
    }
    @Override
    public void onClick(View view) {
        this.itemClickListener.OnItemClick(view,getLayoutPosition());
        // Toast.makeText(view.getContext(), "POS" + getLayoutPosition()
        // , Toast.LENGTH_LONG).show();
    }

    public void setItemClickListener(ItemClickListener ItemClick){
        this.itemClickListener = ItemClick;
    }
}

public ModuleAdapter(List<Modules> Items){
    this.Items = Items;
}

@Override
public int getItemCount() {
    return Items.size();
}

@Override
public ModuleViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.layout_cardview,viewGroup,false);
    return new ModuleViewHolder(view);
}

@Override
public void onBindViewHolder(final ModuleViewHolder ViewHolder, final int position) {

    context = ViewHolder.itemView.getContext();

    Typeface typeface = Typeface.createFromAsset(context.getAssets(),
            "fonts/CaviarDreams.ttf");        

    ViewHolder.Image.setImageResource(Items.get(position).getImages());

    ViewHolder.Actions.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ShowPopupMenu(ViewHolder.Actions,position,ViewHolder);
        }
    });

    ViewHolder.ModuleCode.setText(Items.get(position).getModule()); 
    ViewHolder.ModuleCode.setTypeface(typeface);         ViewHolder.ModuleDescription.setText(Items.get(position).getDescription());

    ViewHolder.ModuleDescription.setTypeface(typeface);       
    ViewHolder.ModuleDate.setText(Items.get(position).getDate());    
    ViewHolder.ModuleDate.setTypeface(typeface);

    ViewHolder.ModuleIds = Items.get(position).getModuleIds();

    ViewHolder.setItemClickListener(new ItemClickListener() {
        @Override
        public void OnItemClick(View view, int Pos) {
            //Toast.makeText(context, "POSITION :" + Pos, Toast.LENGTH_SHORT).show();
        }
    });
}

private void ShowPopupMenu (final View view, final int position,final ModuleViewHolder holder){

    menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()){
                case R.id.action_modify:

                    final Connection connectionupdate = new Connection(context,Connection.DATABASE_NAME,null,
                            Connection.DATABASE_VERSION);          
                    final SQLiteDatabase dbUpdate = connectionupdate.getWritableDatabase();

                    Typeface typeface = Typeface.createFromAsset(context.getAssets(),"fonts/CaviarDreams.ttf");
                    AlertDialog.Builder ModifyModule = new AlertDialog.Builder(context);

                    LayoutInflater modifyinflater = (LayoutInflater)context.getSystemService
                            (Context.LAYOUT_INFLATER_SERVICE);
                    final View viewmodify = modifyinflater.inflate(R.layout.layout_custom_dialog_create_modules,null);

                    TILM  = (TextInputLayout)viewmodify.findViewById(R.id.TILM);
                    TILM.setTypeface(typeface);
                    TILD  = (TextInputLayout)viewmodify.findViewById(R.id.TILD);
                    TILD.setTypeface(typeface);
                    ModuleCodeE  = (EditText)viewmodify.findViewById(R.id.ModuleCode);
                    ModuleCodeE.setTypeface(typeface);
                    ModuleDescE  = (EditText)viewmodify.findViewById(R.id.ModuleDesc);
                    ModuleDescE.setTypeface(typeface);

                    ModuleCodeE.setText(Items.get(position).getModule());
                    ModuleDescE.setText(Items.get(position).getDescription());
                    final String Id = Items.get(position).getModuleIds();

                    ModifyModule.setView(viewmodify);
                    ModifyModule.setIcon(R.drawable.logomini);

                    ModifyModule.setTitle("Construmuebles FM");
                    ModifyModule.setMessage(" Modifica los valores en los siguientes campos :");
                    ModifyModule.setPositiveButton("Actualizar", new DialogInterface.OnClickListener(){
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            ContentValues VUpdate = new ContentValues();

                            VUpdate.put(Database.CamposModuloDetails.KEY_MODULE_CODE,ModuleCodeE.getText().toString());                                VUpdate.put(Database.CamposModuloDetails.KEY_MODULE_DESC,ModuleDescE.getText().toString());

                            long IdUpdate = dbUpdate.update(Database.MODULE_DETAILS_TABLE,VUpdate,Database.CamposModuloDetails
                                    .KEY_MODULE_DETAILS_ID + " = ?",new String []{Id});

                            new UpdateCardView(context,IdUpdate).execute();

                            dialogInterface.dismiss();
                        }
                    });
                    ModifyModule.setNegativeButton("Cancelar", new DialogInterface
                            .OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {

                            dialogInterface.dismiss();
                        }
                    });
                    ModifyModule.show();

                    return true;

                case R.id.action_delete:

                    new  DeleteCardView(context,holder,position).execute();
                    return true;
            }
            return false;
        }
    });
    menu.show();
}

class DeleteCardView extends AsyncTask<Void,Void,Long>{
    private ProgressDialog pDialog;
    ModuleViewHolder holder;
    int position;

    public DeleteCardView(Context context,ModuleViewHolder holder,int position) {
        pDialog = new ProgressDialog(context);
        this.holder = holder;
        this.position = position;
    }

    @Override
    protected void onPreExecute() {
        pDialog.setMessage(" Eliminado registro...");
        pDialog.show();
    }
    @Override
    protected Long doInBackground(Void... voids) {

        String ModuleIdCardView = holder.ModuleIds;
        Connection connection = new Connection(context, Connection.DATABASE_NAME, null,
                Connection.DATABASE_VERSION);
        long i = connection.DeleteByIdCardView(ModuleIdCardView);
        if (i != 0) {
            return i;
        } else {
            return i;
        }
    }
    @Override
    protected void onPostExecute(Long Result) {
        if (pDialog.isShowing()){
            pDialog.dismiss();
            Items.remove(position);
            notifyItemRemoved(position);
            notifyItemRangeChanged(position,Items.size());
            if (Items.size()==0){ /**viewPager.setCurrentItem(0);**/ }
        }
    }
}
}

我的后端期望在“isConnected”属性中收到一个int。不幸的是,只要我更改了select的值,就会将该属性强制转换为字符串:

Dim rg As Range
Dim lnglastrow As Long
Dim intnamemax As Integer
Dim strName() As String


intnamemax = 21
ReDim strName(1 To intnamemax)

 strName(1) = "Bob Smith"
 strName(2) = "Rhys Jones"
 strName(3) = "Rebecca Hickling"

 lnglastrow = ActiveSheet.UsedRange.Rows.Count

 For Each rg In Range("A2:A" & lnglastrow)
    For i = 1 To intnamemax
        Set c = rg.Find(strName(i), LookIn:=xlValues)
           If Not c Is Nothing Then
            MsgBox "Proxy Candidate Found at " & found.Address
           Else
            MsgBox "No Proxy Candidates Found ", vbOKOnly, "Success!"
           End If
        Next i
    Next

End Sub

对于标准<select [(ngModel)]="selected.isConnected" (ngModelChange)="formChanged()" name="etat" id="etat" class="form-control"> <option value="0">Not connected</option> <option value="1">Connected</option> </select> ,我可以使用{ isConnected : "0", // 0 expected } ,但对于<input>,我一无所知。

有没有办法强制角度2将数据转换为int?

5 个答案:

答案 0 :(得分:66)

使用[ngValue]代替&#34;值&#34;:

<select [(ngModel)]="selected.isConnected" id="etat">
    <option [ngValue]="0">Not connected</option>
    <option [ngValue]="1">Connected</option>
</select> 

答案 1 :(得分:2)

如果你想在 formChanged()方法(你尚未提供)中使用它。 你应该使用 +符号,如下所示,

formChanged(): void {
    selected.isConnected = +selected.isConnected;
    ...
}

答案 2 :(得分:1)

不,遗憾的是,你被迫在formChanged()方法中自行解析它,因为你总是从select获得一个字符串。

你可以尝试这样的事情:

formChanged(): void {
    selected.isConnected = parseInt(selected.isConnected);
    // ...
}

答案 3 :(得分:0)

您可以发送一个Number变量来选择并为该select元素指定值。然后,如果要在更改时捕获值,可以添加(更改)事件以选择并检索值,如下所示。

import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  template: `<select value="{{isConnected}}" (change)="printConnected($event.target.value)" name="etat" id="etat" class="form-control">
          <option value="0">Not connected</option>
          <option value="1">Connected</option>
        </select>
        <div *ngIf="changed">You've selected {{isConnected}}<div>`
})
export class AppComponent {

  isConnected : number = 1;
  changed : boolean = false;
  printConnected(value){
this.isConnected = value;
this.changed=true;
  }

}

您可以在http://plnkr.co/edit/xO2mrTdpTGufkgXqdhYD?p=preview

查看示例

答案 4 :(得分:0)

我使用的是反应式绑定,不想使用 [(ngModel)]。相反,我创建了一个使用 JSON.parse(value) 的管道 observable(因为 +value 不处理 "null"):

*.component.html:

    <div class="col-lg-4 form-group">
      <label>Group Type</label>
      <select class="form-control" (change)="groupType$.next($event.target.value)">
        <option [value]="null"></option>
        <option *ngFor="let groupType of filterData.groupTypes" [value]="groupType.id">{{groupType.label}}</option>
      </select>
    </div>
    <div class="col-lg-4 form-group" *ngIf="filteredGroups$ | async as groupOptions">
      <label>Group</label>
      <select class="form-control" (change)="group$.next($event.target.value)">
        <option [value]="null"></option>
        <option *ngFor="let group of groupOptions" [value]="group.id">{{group.label}}</option>
      </select>
    </div>
    <div class="col-lg-4 form-group">
      <label>Status</label>
      <select class="form-control" (change)="status$.next($event.target.value)">
        <option [value]="null"></option>
        <option *ngFor="let status of filterData.statuses" [value]="status.id">{{status.label}}</option>
      </select>
    </div>

*.component.ts:

  group$ = new BehaviorSubject<string>(null);
  groupId$ = this.group$.pipe(
    map((groupId: string) => JSON.parse(groupId) as number)
  );
  groupType$ = new BehaviorSubject<string>(null);
  groupTypeId$ = this.groupType$.pipe(
    map((typeId: string) => JSON.parse(typeId) as number)
  );
  status$ = new BehaviorSubject<string>(null);
  statusId$ = this.status$.pipe(
    map((statusId: string) => JSON.parse(statusId) as number)
  );