将单引号作为ng-true-value表达式传递动态值失败

时间:2015-03-12 10:16:28

标签: angularjs

我的复选框输入设置了" 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"
};

如果选中第二个框。

2 个答案:

答案 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提交到数据库。

相关问题