复选框未绑定到angularjs中的范围

chr*_*ris 58 checkbox binding coffeescript angularjs angularjs-ng-include

我正在尝试使用ng-model将复选框绑定到范围.复选框的初始状态对应于范围模型就好了,但是当我选中/取消选中复选框时,模型不会更改.需要注意的一些事项是模板是在运行时使用ng-include动态加载的

app.controller "OrdersController", ($scope, $http, $location, $state, $stateParams, Order) ->

  $scope.billing_is_shipping = false
  $scope.bind_billing_to_shipping = ->
    console.log $scope.billing_is_shipping


<input type="checkbox" ng-model="billing_is_shipping"/>
Run Code Online (Sandbox Code Playgroud)

当我选中该框时,控制台会记录错误,当我取消选中该框时,控制台会再次记录错误.我也在范围上有一个订单模型,如果我将复选框的模型更改为order.billing_is_shipping,它工作正常

小智 151

我有一段时间在这个问题上挣扎.有效的是将输入绑定到对象而不是基元.

<!-- Partial -->
<input type="checkbox" ng-model="someObject.someProperty"> Check Me!

// Controller
$scope.someObject.someProperty = false
Run Code Online (Sandbox Code Playgroud)

  • WHYYYYYY!谢谢你,我欠你啤酒和饼干.另外,我可以为你提供一切:我在同一页面上有四个复选框,复制/粘贴东西,在不同的模型上进行相同的操作..好吧,两个工作,两个没有! (4认同)
  • 我有同样的问题,这解决了它.我想知道为什么原语不起作用(正如他们在[官方文档]中所做的那样(https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D))... (3认同)
  • 这次真是万分感谢!!不知道为什么这不适用于原语,这可能只是Angular中的一个错误吗? (3认同)

zs2*_*020 24

如果使用加载模板,则ng-include需要使用$parent访问父作用域中定义的模型,因为ng-include如果要通过单击复选框进行更新.

<div ng-app ng-controller="Ctrl">
    <div ng-include src="'template.html'"></div>
</div>

<script type="text/ng-template" id="template.html">
    <input type="checkbox" ng-model="$parent.billing_is_shipping" ng-change="checked()"/>
</script>

function Ctrl($scope) {
    $scope.billing_is_shipping = true;

    $scope.checked = function(){
        console.log($scope.billing_is_shipping);
    }
}
Run Code Online (Sandbox Code Playgroud)

DEMO


anc*_*jic 9

在我的指令中(在链接函数中)我创建了范围变量成功,如下所示:

link: function(scope, element, attrs) {
            "use strict";

            scope.success = false;
Run Code Online (Sandbox Code Playgroud)

并在范围模板中包含输入标记,如:

<input type="checkbox" ng-model="success">
Run Code Online (Sandbox Code Playgroud)

这没用.

最后,我将范围变量更改为如下所示:

link: function(scope, element, attrs) {
            "use strict";

            scope.outcome = {
                success : false
            };
Run Code Online (Sandbox Code Playgroud)

我的输入标签看起来像这样:

<input type="checkbox" ng-model="outcome.success">
Run Code Online (Sandbox Code Playgroud)

它现在按预期工作.我知道对此的解释,但忘了,也许有人会为我填写.:)


Rk2*_*220 9

扩展Matt的答案,请参阅Applehead.io视频,该视频解决了这个问题并提供了解释: 为什么直接绑定属性到$ scope会导致问题

请参阅:https://groups.google.com/forum/#!topic/angular/7Nd_me5YrHU

通常这是由于你的ng-controller和你正在创建新范围的输入之间的另一个指令.当select写出它的值时,它会将它写入最近的范围,因此它会将它写入此范围而不是更远的父级.

最好的做法是永远不要直接绑定到范围内的变量ng-model,这也被称为在你的ngmodel中总是包含一个"点".

  • 这个答案完全依赖于外部链接.如果它们变得无效,你的答案将变得毫无用处.所以请编辑它并至少添加可以在那里找到的内容的摘要.谢谢! (2认同)