【问题标题】:Get / Set entity when dealing with relation attribute处理关系属性时获取/设置实体
【发布时间】:2016-02-25 14:18:18
【问题描述】:

我正在使用 angular-wakanda 连接器的 Wakanda 环境中工作。

假设这个模型:Employee(firstName,lastName,company) 和 Company(name)

在员工表单中,我有一个选择输入,其中填充了公司名称(这是一个实体集合)。

我在选择中设置了ng-model="selectedCompany"

当我选择一家公司并执行保存时,我得到的值代表我在选项值(ID 或名称)中传递的值。

当我使用$create() 方法将值分配给新实体时,我不知道用哪种方法将实体设置为关系属性。我假设我必须给出一个实体。问题是我已经拥有所有实体的实体集合。所以我不明白为什么我应该再次查询服务器只是为了分配我已经拥有的东西。

所以问题是我们应该有一个像$find$getById 这样的方法,它不会在服务器上执行请求,而是获取已经加载到 entityCollection 中的实体。现在我使用我自己的方法在我的数组上做一个简单的循环。 (如果有人需要,我可以分享代码)

我是否错过了这样做的方法?

【问题讨论】:

    标签: angularjs wakanda


    【解决方案1】:

    假设您的 selectedCompany 变量包含一个实体(Company 类型),您只需在 $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
      }
    };
    

    【讨论】:

    • 你尝试过你的第一个语句吗?因为我已经尝试过,但我无法将实体值传递给我的 html 选项元素。如果这样做,我只需设置一个字符串来表示我无法传递给实体关系属性的 JSON 对象。所以对我来说映射解决方案是最好的,因为我可以得到对象然后属性正在等待。
    • 这是我的 html 代码&lt;option ng-repeat="category in formCtrl.categories" class="form-group" value="{{category}}"&gt;{{category.name}}&lt;/option&gt;,你想让我这样做:&lt;option ng-repeat="category in formCtrl.categories" class="form-group" value="{{category}}"&gt;{{category}}&lt;/option&gt;?但这会像我说的那样打印 JSON 字符串,而不是真正得到实体对象。
    • 你可以通过在你的&lt;select&gt; 标签上使用ng-option 指令来做到这一点,我会更新我的答案给你一个例子。
    • 太棒了。谢谢。我不知道这个 ng-options。这就是我要找的。​​span>
    • 恐怕我对这个问题没有答案,这个问题与 Angular 相关,而不是 Wakanda。选择处理对我来说一直很痛苦。
    【解决方案2】:

    我认为你真正的问题是你迭代公司集合的每个实体的名称/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 将包含实体

    【讨论】:

    • 问题是我没有使用 ng-options,而是在 &lt;option&gt; 标签上使用 ng-repeat。 ng-options="category.name for category in formCtrl.categories" 工作对我来说很棒。
    猜你喜欢
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多