我的复选框输入设置了" true"动态值基于变量trueVal
,这是一个字符串。
<input ng-model="foo" ng-true-value="'{{trueVal}}'">
例如,对于trueVal = "something"
,foo === "something"
选中复选框时。
除非trueVal
等于其中包含单引号的字符串,否则此方法有效:Customer didn't understand
。在这种情况下,有一个错误:
错误:[$ parse:lexerr] Lexer错误:表达式27-28 [&#39;]中的未终止报价[&#39;客户不理解&#39;]。
我无法删除单引号,因为字符串应按原样设置为foo
。
更广泛的背景:
我根据从后端获得的options
列表创建了一组复选框:
<div ng-repeat="(key,option) in options">
<input type="checkbox"
ng-model="foo[key]"
ng-true-value="'{{option.trueVal}}'"
ng-false-value="null">
</div>
所以,给定:
options = {
0: {trueVal: "Customer was late"},
1: {trueVal: "Customer didn't understand"}
};
我希望看到:
foo = {
1: "Customer didn't understand"
};
如果选中第二个框。
答案 0 :(得分:7)
简短版本,ng-true-val
需要一个常量,并将以下表达式作为参数传递:'Customer didn't understand'
用于评估,由于未终止单个格式而导致格式错误报价。
简单(但有点难看)的方法是在视图中用'
替换\'
(这不会改变实际值 - 只是对其进行编码):
<input type="checkbox" ng-model="foo"
ng-true-value="'{{trueVal.replace('\'', '\\\'')}}'"
ng-false-value="null">
更好的方法可能是使用ng-change
:
<input type="checkbox" ng-model="t"
ng-change="foo = t ? trueVal : null">
更长版本
在封面ng-true-value
调用$parse
服务:var parseFn = $parse(expression)
,并期望parseFn.constant === true
。后者仅在表达式为常数时才为真:
expression = 'string'; // string literal
expression = '5' // number literal
expression = {v: 'string'} // object literal with a constant
expression = 'foo' + 'bar'; // expression that evaluates to a constant
在您的情况下,您需要使用变量trueVal
,将其插值为值{{trueVal}}
,以成为最终将按上述方式进行评估的表达式'{{trueVal}}'
的一部分。 / p>
这就是为什么'
的替换适用于\'
,因为它逃脱了单引号,就像你直接写了表达式一样:
ng-true-value="'Customer didn\'t understand'"
如果您确定"
的值中没有双引号(options
),您也可以简单地颠倒引号的顺序,而无需执行replace
}:
ng-true-value='"{{trueVal}}"`
如果trueVal
值具有双引号something with "quotes"
,则会出于同样的原因失败。
答案 1 :(得分:1)
试试这个。
标记
<input type="checkbox" ng-model="dummyModel" ng-model-options="{getterSetter: true}">
在控制器中
var trueValue = "my true' value";
var falseValue = false;
var _model;
$scope.dummyModel = function (val) {
if (angular.isDefined(val)) {
_model = val ? trueValue : falseValue
}
return _model === trueValue;
}
使用_model
提交到数据库。