处理关系属性时获取/设置实体
Get / Set entity when dealing with relation attribute
我在使用 angular-wakanda 连接器的 Wakanda 环境中工作。
假设此模型:Employee(firstName,lastName,company) 和 Company(name)
在员工表单中,我有一个 select 填写公司名称的输入(这是一个实体集合)。
我在select
中设置了一个ng-model="selectedCompany"
当我select一家公司并执行保存时,我得到的值代表我在我的选项(ID或名称)的值中传递的值。
当我使用 $create()
方法将值分配给新实体时,我不知道如何将实体设置为关系属性。我假设我必须给出一个实体。问题是我已经有了包含所有实体的实体集合。所以我不明白为什么我应该再次查询服务器只是为了分配我已经拥有的东西。
所以问题是我们应该有一个像 $find
或 $getById
这样的方法,它不会在服务器上发出请求,而是获取已经加载到 entityCollection 中的实体。现在我使用我自己的方法对我的数组做一个简单的循环。 (如果有人需要,我可以分享代码)
我是否错过了这样做的方法?
假设您的 selectedCompany
变量包含一个实体(公司类型),您只需在 $create()
调用中传递此变量,并使用 属性 名称,如下所示:
var newEmployee = ds.Employee.$create({
firstName: 'foo',
lastName: 'bar',
company: $scope.selectedCompany
});
如果 selectedCompany
仅包含公司名称或 ID,则您需要一个数组来映射公司及其名称或 ID。类似的东西:
//When retrieving collection
var companyMap = [];
companies.forEach(function (company) {
companyMap[company.ID] = company;
}
//When you want your company with its ID
var company = companyMap[$scope.selectedCompany];
但最简单的方法是第一种,您 <select>
直接遍历实体集合,这样您就可以处理实体了。
编辑:使用 ng-option
检索对象
要获取您在 select
上迭代的对象,您可以像这样使用 ng-option
:
<select
ng-model="selectedCompany"
ng-change="companyChanged()"
ng-options="c.name for c in companies"
>
</select>
在控制器上
$scope.selectedCompany = null;
$scope.companyChanged = function () {
if ($scope.selectedCompany) {
//selectedCompany is your company entity
//you can manipulate it like any other entity
$scope.selectedCompany.$save(); //for example
}
};
我认为您真正的问题是您迭代了公司集合的每个实体的 name/ID。
这是迭代集合的糟糕方法:
<select ng-model="selectedCompany" ng-options="company.nom as company.nom for i in collenctionOfCompanies">
<option value=""></option>
</select>
在这种情况下,所选公司将仅包含公司名称。
但是,如果您这样更改代码:
<select ng-model="selectedCompany" ng-options="company as company.nom for i in collenctionOfCompanies">
<option value=""></option>
</select>
然后 selectedCompany 将包含实体
我在使用 angular-wakanda 连接器的 Wakanda 环境中工作。
假设此模型:Employee(firstName,lastName,company) 和 Company(name)
在员工表单中,我有一个 select 填写公司名称的输入(这是一个实体集合)。
我在select
中设置了一个ng-model="selectedCompany"
当我select一家公司并执行保存时,我得到的值代表我在我的选项(ID或名称)的值中传递的值。
当我使用 $create()
方法将值分配给新实体时,我不知道如何将实体设置为关系属性。我假设我必须给出一个实体。问题是我已经有了包含所有实体的实体集合。所以我不明白为什么我应该再次查询服务器只是为了分配我已经拥有的东西。
所以问题是我们应该有一个像 $find
或 $getById
这样的方法,它不会在服务器上发出请求,而是获取已经加载到 entityCollection 中的实体。现在我使用我自己的方法对我的数组做一个简单的循环。 (如果有人需要,我可以分享代码)
我是否错过了这样做的方法?
假设您的 selectedCompany
变量包含一个实体(公司类型),您只需在 $create()
调用中传递此变量,并使用 属性 名称,如下所示:
var newEmployee = ds.Employee.$create({
firstName: 'foo',
lastName: 'bar',
company: $scope.selectedCompany
});
如果 selectedCompany
仅包含公司名称或 ID,则您需要一个数组来映射公司及其名称或 ID。类似的东西:
//When retrieving collection
var companyMap = [];
companies.forEach(function (company) {
companyMap[company.ID] = company;
}
//When you want your company with its ID
var company = companyMap[$scope.selectedCompany];
但最简单的方法是第一种,您 <select>
直接遍历实体集合,这样您就可以处理实体了。
编辑:使用 ng-option
要获取您在 select
上迭代的对象,您可以像这样使用 ng-option
:
<select
ng-model="selectedCompany"
ng-change="companyChanged()"
ng-options="c.name for c in companies"
>
</select>
在控制器上
$scope.selectedCompany = null;
$scope.companyChanged = function () {
if ($scope.selectedCompany) {
//selectedCompany is your company entity
//you can manipulate it like any other entity
$scope.selectedCompany.$save(); //for example
}
};
我认为您真正的问题是您迭代了公司集合的每个实体的 name/ID。
这是迭代集合的糟糕方法:
<select ng-model="selectedCompany" ng-options="company.nom as company.nom for i in collenctionOfCompanies">
<option value=""></option>
</select>
在这种情况下,所选公司将仅包含公司名称。
但是,如果您这样更改代码:
<select ng-model="selectedCompany" ng-options="company as company.nom for i in collenctionOfCompanies">
<option value=""></option>
</select>
然后 selectedCompany 将包含实体