Angular.js: 特性:ngTrueValue 应该接受非字符串值

创建于 2012-07-25  ·  60评论  ·  资料来源: angular/angular.js

对于 ng-model 复选框,ngTrueValue 仅支持字符串。 它实际上应该只接受一个角度表达式和 eval 来获取值,因此它支持说一个 js 对象。

PRs plz! forms moderate feature

最有用的评论

我刚刚有了一个有趣的认识。 我试图做的事情——从表面上看,你们很多人一直在努力做的事情——实际上可以通过以下方式完成:

ng-true-value="{{ myVariable | json }}"

这支持字符串值、布尔值和数字。 不确定我是否真的喜欢这个,但我确实觉得它很有趣。 也许这会帮助其他人。

所有60条评论

我不完全确定ngTrueValue的目的,除了它似乎是一种方便的指令,用于在一种情况下将手表添加到控制器中。 我怀疑如果你想将某个模型设置为一个复杂的值,在你的复选框模型上放置一个$scope.$watch并相应地修改范围上的模型可能会更干净。

@coli ,你有一个特定的用例吗? @IgorMinar@mhevery@vojtajina ,你们怎么看?

用例实际上相当普遍:

我在说 $scope.categories=[{id:5,name:"First"},...} 中有一个说类别对象数组

然后我有一个 selectedCategories 数组,其中包含这些类别的子集。

我想为某些类别(分页)显示一个复选框,当您选中或取消选中该复选框时, selectedCategories 会更改。

我实际上编写了一个指令,该指令将覆盖默认复选框行为以添加对上述内容的支持。 如果需要,我可以分享代码。

我的使用结果是这样的,在我的情况下,需要 keyField 来进行对象比较,选择的组对象和组对象最初可能略有不同(它们来自 2 个不同的后端 API)

<ng-repeat="group in groups>
    <input type='checkbox' ng-model="selectedArray" ng-true-value="group" mi-checkbox="{keyField:'id'}">
</>

哎呀,我有一个更简单的用例,但我很失望地发现它不起作用——我需要一个整数,而不是字符串!

我正在使用模板来呈现复选框控件。 在这种情况下,我无法知道真实值,该值取决于我要呈现的特定控制信息。

我也希望 ng-true-value 是一个表达式。 如果您的复选框数量是在运行时确定的,则必须使用具有超时包装器的范围方法。

+1。 支持 ng-true-value 中的表达式

+1 支持 ng-true-value 中的整数

+1 表示表达式而不是字符串

+1 支持表情!

+1 表达

+1 支持对象:

<div ng-repeat="group in groups">
    <input type='checkbox' ng-model="array[$index]" ng-true-value="group" />
</div>

@coli你介意分享你写的指令吗? 当这个问题仍在考虑中时,这对我有很大的帮助。 也许在一个要点?

@brab不幸的是,我在以前的工作中编写了它,但基本上,它类似于复选框的内置代码,我复制/粘贴到自定义指令并添加了表达式支持。 (+一个丑陋的黑客来删除内置的)

表情会很棒! 然而,即使是整数的 javascript 真值测试也是可以预期的。 我使用 $resource 填充从数据库布尔值返回整数值(1 或 0)的对象。 然后将它们附加到绑定输入上的 ng-model 的 $scope。 真的很惊讶地发现设置 ng-true-value="1" 不会将整数 1 识别为 true 并选中该框。 将研究同时提到的其他方法。

+1

+1 表达

+1。 支持 ng-true-value 中的表达式

+1 支持表达!
就我而言,需要动态构建表单。
例如:http: //jsfiddle.net/federosky/N8Wjm/5/

+1 整数

1+ 表示整数

+1 整数(或任何 JS 数字)

:+1: 支持表达请! 请! 拜托! :-)

+1 至少对于整数支持,最好是表达式。

有人提出支持数字的 PR 怎么样?

+1 表达

+1 整数

+1 整数

+1

:+1: 用于表达式。

+1。 当我有一个应该在页面上表示为“可见”复选框的布尔属性“隐藏”时遇到问题。 所以,我需要“选中”状态来表示 FALSE,而未选中状态表示“TRUE”。

我想知道这个问题的简单解决方法是什么? 我真的不喜欢编写自己的复选框指令或使用反向辅助布尔属性污染范围,只是为了将它们用于间接绑定。

这可能很容易实现,我会在睡觉前尝试一下。

我的补丁只支持常量表达式,但如果人们真的需要它,我想任何表达式都足够了。 不过,这是不引起重大变化的最简单方法。

+1

+1

+1

+1 整数类型

+1

+1 表达

+1

+1

+1

+1

:+1:

这些是现在需要的技巧(许多 WTF):

<input type="checkbox" ng-model="fake" ng-checked="!notChecked" ng-change="notChecked = !notChecked"/>

+1

+1 “+1”已经两年了。 为什么我们还不支持这个?

@jancarloviray ,+1

太糟糕了:对我来说,这意味着事情变得更加复杂。
以前我用
ng-true-value="{{proxyOnValue}}"
proxyOnValue 在控制器中被初始化。
(实际值不同的 HTTP/HTTPS/FTP/POP3/SMTP 代理配置重复使用相同的视图。)

现在我试过了
ng-true-value="proxyOnValue"
但这会引发异常,因为表达式不是常量。

所以这意味着我必须用更复杂的实现(watch 或 Object.defineProperty)替换一个简单的实现(ngTrueValue),所以实际上与预期相反。

为什么要进行这种人为限制?
只是

  • 每当模型更改或用户单击复选框时,使用 ngTrueValue/ngFalseValue 的当前值
  • 为了更好地衡量,对 ngTrueValue/ngFalseValue 表达式(如果它们不是常量)进行内部监视,并在监视触发时更新复选框状态。

@eekboom - 你仍然可以使用你的插值: http ://plnkr.co/edit/LQ6OpFjkjiFLxxMJ9hxj?p=preview

@petebacondarwin - 他可以使用插值,但对他没有帮助: http ://plnkr.co/edit/nNwjEkPIDJwe60HWX950?p=preview
该值仅检查一次 - 以后的更改不会被考虑在内,因此始终只使用初始值。

@dliebscher - 我的理解是@eekboom只想初始化一次:

以前我使用ng-true-value="{{proxyOnValue}}" ,其中 proxyOnValue 在控制器中初始化。

是和否:我只想初始化一次,但只能在通过 xhr 加载代理配置之后。 所以它在视图初始化后改变一次(从未定义)。

@eekboom
当我从 1.2 迁移时,我切换到以下版本:

ng-true-value="{{proxyOnValue}}"

ng-true-value="'{{proxyOnValue}}'"

哪个有效,但看起来很愚蠢

我刚刚有了一个有趣的认识。 我试图做的事情——从表面上看,你们很多人一直在努力做的事情——实际上可以通过以下方式完成:

ng-true-value="{{ myVariable | json }}"

这支持字符串值、布尔值和数字。 不确定我是否真的喜欢这个,但我确实觉得它很有趣。 也许这会帮助其他人。

getu-lar 我已经尝试过你所说的,对于一个复杂的对象,它可以工作。 在我用ng-false-value="{}"填充的 ng-false-value 中。在处理数据之前,我通过一个过滤器来切断数组中的所有虚假值。 所以,非常感谢!

getu-lar 的解决方案对我有用。 谢谢。

我试图使用解析为带有下划线的字符串的表达式,例如“101_3”。 我使用了 getu-lar 的解决方案,它很有效。 感觉就像一个黑客虽然。 谢谢分享!

+1 表达

+1

Angular 团队似乎不太希望为 1.x 系列提供一个健全的复选框指令……这不会太难。 由于强制引用,表达式支持将完全向后兼容。

在那之前,建议的解决方法对我有用:

ng-true-value="{{ myVariable | json }}"

确保在控制器中定义了myVariable 。 我试图在 post-link 中定义它,但它不起作用。

此页面是否有帮助?
0 / 5 - 0 等级