将模型另存为修改后的值

时间:2014-10-08 13:45:48

标签: json angularjs

这是我正在使用的一段代码:

<select ng-model="rule.platforms" ng-options="platform for platform in platforms" 
        name="platform" multiple required>
  <option value="">-- platform --</option>
</select>

Angular中多重选择的默认行为是将数组绑定到模型。例如:

rule.platforms = ["twitter", "google"]

但是,由于需要将其保存到数据库中,因此需要将所有值连接在一起成为一个字符串。现在,最清晰的解决方案似乎是在保存/更新之前解析值,但这样做会增加很多逻辑,因为需要遍历所有数据并检查每个规则。

我真正想要做的是有一种方法可以改变最初存储绑定到模型的值的方式,因此,除了上述内容之外,它还可以保存这种值:

rule.platforms = "twitter, google"

这甚至可能吗?我一直在浏览Angular文档,但还没有遇到过这样的事情。如果有人知道实现这种行为的简便方法,请告诉我!

** 编辑 **

为了澄清我的具体用例,我想要包含有问题的数据结构:

$scope.data = 
{
  project: {
    name: "",
    topics_attributes: [
      {
        name: "",
        feed_size: "",
        topic_sources_attributes: [
          {
            platform: "",
            keywords: "",
            authors: ""
          }
        ],
        rules_attributes: [
          {
            name: "",
            platforms: "",
            conditional: "",
            terms: ""
          }
        ]
      }
    ]
  }
}

问题在于rules_attributes.platforms为rules_attributes,并且它的所有子项都是动态创建的。如果这是一个静态模型参数,那么迈克建议的解决方案将完美地运行。不幸的是,模型的动态特性使得很难按照建议进行更改。

1 个答案:

答案 0 :(得分:1)

据我所知,实现这一目标的最简单方法是使用临时范围变量来保存平台。然后,您可以使用$ watch查看临时变量以进行更改,解析该值并使用字符串值更新rule.platforms。

编辑:我想你有类似于这种非常简化的方法:
http://jsfiddle.net/oqwh5gs7/12/

function MyCtrl($scope) {
  $scope.rule = {};
  $scope.rule.platforms = ['google'];
  $scope.tempPlatforms = [];
  $scope.platforms = ['google', 'twitter'];

  for(var i in $scope.rule.platforms) {
    $scope.tempPlatforms[i] = $scope.rule.platforms[i];
  }

  $scope.$watch('tempPlatforms', function(newValue, oldValue) {
    $scope.rule.platforms = newValue.join();
  });
}

如果修复了可用的平台,那么更新正确的规则不应该成为问题。您可以将select放在指令中,并通过&#34; =&#34;传递当前规则。或&#34;&amp;&#34;绑定取决于您的需求。如果可用平台根据当前规则改变,那么当然可能会有点麻烦......

编辑:我仍然不确定我是否正确理解了这个问题,但我更新了一个动态创建新规则的方法来演示我如何设想你的问题:{{3 }}

基本上我只为select创建了一个指令,并添加了$ scope。$ watch(&#39; rule&#39;,...)来反映规则的动态变化。