angularjs ng-false-value设置为空

Pau*_*ley 5 javascript angularjs

如果我有一个像这样的角度的复选框:

<div ng-repeat="(key,option) in metaItem.fieldOptions">
    <input type="checkbox" 
           name="metaField[]"
           ng-model="issueForView.metaData[subIndex].fieldValue[key]"
           ng-true-value="'{{option.optionValue}}'" 
           ng-false-value="'{{null}}'">     
           {{option.optionPlaceholder}}
</div>
Run Code Online (Sandbox Code Playgroud)

所以ng-model,issueForView.metaData[subIndex].fieldValue[key]最初是空的,它是这样的:

{}
Run Code Online (Sandbox Code Playgroud)

说我点击供应商的选项,我得到这个:

{"0":"Supplier"}
Run Code Online (Sandbox Code Playgroud)

然后,如果我取消选择,我得到这个:

{"0":""}
Run Code Online (Sandbox Code Playgroud)

取消选择我想要的是:

{}
Run Code Online (Sandbox Code Playgroud)

这是为了使其与我正在替换的代码保持一致.有什么建议?

New*_*Dev 4

编辑 2 - 根据评论修改答案:

从评论中,我了解到您拥有的对象模型如下:

metaItem.fieldOptions = 
  {0: {optionValue: "Supplier"}, 
   1: {optionValue: "SomethingA"}, 
   2: {optionValue: "SomethingB"}};
Run Code Online (Sandbox Code Playgroud)

并且您希望选定的值填充该fieldValue对象。因此,对于选定的键02,将出现以下内容:

issueForView.metaData[subIndex].fieldValue = {0: "Supplier", 2: "SomethingB"};
Run Code Online (Sandbox Code Playgroud)

问题是如果你取消选择0,你会得到这个:

issueForView.metaData[subIndex].fieldValue = {0: "", 2: "SomethingB"};
Run Code Online (Sandbox Code Playgroud)

但你想要这个:

issueForView.metaData[subIndex].fieldValue = {2: "SomethingB"};
Run Code Online (Sandbox Code Playgroud)

答案:undefined如果您分配了以下内容 ,那么这个问题很容易解决ng-false-value

<input type="checkbox" 
       ng-model="issueForView.metaData[subIndex].fieldValue[key]" 
       ng-true-value="'{{option.optionValue}}'" ng-false-value="undefined">
Run Code Online (Sandbox Code Playgroud)

笨蛋

====

原答案:

简而言之,您希望模型设置ng-model"some string"iftrue和空对象{}- if false,对吧?

然后,只需将它们设置为ng-true-valueng-false-value

<input type="checkbox" 
       ng-model="foo" ng-true-value="'some string'" ng-false-value="{}">
Run Code Online (Sandbox Code Playgroud)

要将其直接应用到您的示例中,

<div ng-repeat="(key,option) in metaItem.fieldOptions">
    <input type="checkbox" 
           ng-model="issueForView.metaData[subIndex].fieldValue[key]"
           ng-true-value="'{{option.optionValue}}'" 
           ng-false-value="{}">     
           {{option.optionPlaceholder}}
</div>
Run Code Online (Sandbox Code Playgroud)

编辑:

"some string"如果您想要将模型设置为对象而不是,则可以提供硬编码内联的对象文字:

<input type="checkbox" 
       ng-model="foo" ng-true-value="{0: 'Supplier'}" ng-false-value="{}">
Run Code Online (Sandbox Code Playgroud)

在您的示例中,该对象是在ng-repeat的迭代中动态设置的,那么如果您准备好该对象文字,那就更好了。

比如说,您进行option.optionValue === {0: "Supplier"}了这次迭代(看起来不像您所做的那样,但这将是正确的方法,因为该对象实际上是一个“选项值”),那么您可以像这样设置它:

<input type="checkbox" 
       ng-model="issueForView.metaData[subIndex].fieldValue[key]" 
       ng-true-value="{{option.optionValue}}" ng-false-value="{}">
Run Code Online (Sandbox Code Playgroud)

如果您没有准备好它并且需要“即时”构建它,您可以使用ng-init它。假设"0"您的示例中的 源自option.optionKey,并且"Supplier"源自option.optionValue

<input type="checkbox"
       ng-init="t = {}; t[option.optionKey] = option.optionValue"
       ng-model="issueForView.metaData[subIndex].fieldValue[key]" 
       ng-true-value="{{t}}" ng-false-value="{}">    
Run Code Online (Sandbox Code Playgroud)