angular - 如何创建链接到另一个模型的 Angular 模型?
问题描述
我正在使用 Angular 7 和 Rails 5。我有这个模型,src/app/order.ts,
import { Product } from './product';
export class Order{
public id:number;
public reference:string;
public product:Product;
}
然后我使用以下服务调用添加订单...
src/app/order-add/order-add.component.html
<form (ngSubmit)="onSubmit()">
<div class="form-group">
<label class="col-xs-4 control-label" for="orderProduct">Product: </label>
<div class="col-xs-8">
<select [(ngModel)]="order.product" name="orderProduct">
<option *ngFor="let product of products; let i = index" [value]="products[i].id" [selected]="order !== 'undefined' && products[i].id == order.product?.id">
{{product.name}}
</option>
</select>
</div>
<label class="col-xs-4 control-label" for="orderReference">Order Reference: </label>
<div class="col-xs-8">
<input type="text" style="width: 300px" class="form-control" required
[(ngModel)]="order.reference" name="orderReference">
</div>
<div>
<input type="submit" [value]="order.id !== undefined ? 'Update' : 'Create'" />
</div>
</div>
</form>
这是用于添加订单的 HTML ...
src/app/order-add/order-add.component.ts
...
public onSubmit(){
console.log("Adding an order: " + this.order.reference);
if(this.order.id){
this.apiService.update("orders/"+this.order.id,this.order).subscribe((r)=>{
console.log(r);
alert("Order updated !");
})
}
else
this.apiService.post("orders",this.order).subscribe((r)=>{
console.log(r);
this.order = new Order();
alert("Order added !");
});
}
}
我设置了一个 Rails 5 控制器来进行添加,如下所示...
class OrdersController < ApplicationController
before_action :set_order, only: [:show, :update, :destroy]
...
# POST /orders
def create
@order = Order.new(order_params)
if @order.save
render json: @order, status: :created, location: @order
else
render json: @order.errors, status: :unprocessable_entity
end
end
...
# Only allow a trusted parameter "white list" through.
def order_params
params.require(:order).permit(:reference,:product_id)
end
但是提交的产品永远不会被添加,尽管我在下拉列表中选择了它。这是 Rails 控制器日志(注意没有产品)...
Started POST "/orders" for ::1 at 2019-09-01 12:01:31 -0500
Processing by OrdersController#create as HTML
Parameters: {"product"=>"3", "reference"=>"22xxx", "order"=>{"reference"=>"22xxx"}}
(0.3ms) BEGIN
SQL (1.3ms) INSERT INTO "orders" ("reference", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["reference", "22xxx"], ["created_at", "2019-09-01 17:01:31.975467"], ["updated_at", "2019-09-01 17:01:31.975467"]]
(0.4ms) COMMIT
Completed 201 Created in 16ms (Views: 0.9ms | ActiveRecord: 23.5ms)
我是否需要在我的 Angular 模型或 Rails 控制器中执行其他操作以确保提交产品?
解决方案
您可以尝试使用带有选择标签的更改事件
<select [(ngModel)]="selectedProductIndex" name="orderProduct" (change)="onProductChange(selectedProductId)">
<option *ngFor="let product of products; let i = index" [value]="i" [selected]="order !== 'undefined' && products[i].id == order.product?.id">
{{product.name}}
</option>
</select>
ts代码:-
selectedProductIndex: number;
onProductChange(selectedProductIndex: number) {
this.order.product = products[selectedProductIndex];
}
推荐阅读
- java - Spring Boot REST 端点忽略 Content-Type
- javascript - 按产品类从数组创建产品列表,然后保存在本地存储中
- sql - SQL Server 到 Azure 流程工作流迁移
- javascript - onchange 函数未在移动浏览器上触发
- sql - 查找每一行的日期范围。LEAD/LAG,但具有不同的类型/动作
- python - 创建 Geoviews quadmesh 时出错:没有可用的存储后端能够支持提供的数据格式
- python - Curl 的 Python 等效项给出 400 响应
- angular - 带有Angular 9的HammerJs手势
- java - 如何使用缓冲阅读器在java中不跳过行尾字符的情况下读取行
- javascript - jQuery 每行 textarea 发送 ajax 请求