【问题标题】:Angularjs directive for checkbox with ng-model带有 ng-model 的复选框的 Angularjs 指令
【发布时间】:2013-12-22 10:05:02
【问题描述】:

我有一个适用于复选框的指令,该复选框也有 ng-model。
在链接功能指令中,复选框未获取模型的值。
如果添加超时(不管多长时间,即使是 0 )也是有效的。

我的控制和指令:

var myApp = angular.module("myApp",[])
.directive("checkBox", function($timeout){
    return {
        restrict: 'A',
        link: function (scope, element, attrs, ctrl) {
            console.log("Check box is : " + element[0].checked);
            scope.message += "Check box is : " + element[0].checked + " , ";
            $timeout(function(){
                scope.message += "Check box is : " + element[0].checked;    
                console.log("Check box is : " + element[0].checked);
            },0);
        }
    }
});

function myCtrl($scope){
    $scope.checkBoxModel = true;
    $scope.message = "";
}

HTML:

<div ng-app="myApp" ng-controller="myCtrl" >
    <input type="checkbox" ng-model="checkBoxModel" check-box>
        <br/>
        {{message}}
</div>

菲德尔-http://jsfiddle.net/myyjL/

提前致谢。

【问题讨论】:

    标签: angularjs angularjs-directive


    【解决方案1】:

    你可能不应该做你想做的事,但这是可能的。

    这是一个可以正常工作的 plunkr,没有超时:

    http://jsfiddle.net/myyjL/2/

    .directive("checkBox", ['$timeout', function($timeout){
        return {
            restrict: 'A',
            replace: false,
            scope: {
                ngModel:'='
            },
            transclude: true,
            link: function (scope, element, attrs, ctrl) {
                scope.$watch('ngModel', function(newValue){
                    scope.$parent.message = 'Checkbox value is: ' + newValue;
                });
            }
        }
    }])
    

    这种方法的问题是你的指令知道它之外的东西(如在 {{message}} 变量中)。这是一个糟糕的设计,你应该重新设计它。此外,在您的小提琴中,您使用 element[0].checked,而您可以轻松使用 ng-modal 值。但是 ng-modal 可能不存在。此外,输入可能不是真正的复选框,因此您的方法也失败了。如何解决?我会在几秒钟内给你写一个示范性的 plunkr:

    http://plnkr.co/edit/jyY6sQwXmtlGOvpdzETR?p=preview

    angular.module('myApp', [])
    
    .directive('box', [function(){
        return {
            restrict: 'E',
            scope: {
                ngModel: '='
            },
            templateUrl: 'box.tpl.html',
            replace: true
        };
    }])
    
    .controller('MyController', ['$scope', function MyController($scope){
        $scope.checkboxValue = true;
    }]);
    

    我们在这里所做的是通过在模板中提供复选框来确保我们的指令始终是一个复选框。您可以对指令进行样式设置等。

    【讨论】:

    • 嗨,爸爸。感谢您的回答。我知道在指令之外使用东西不是好的设计。我添加这个只是为了在屏幕上显示假/真的例子......关于手表 - 我不想在每次模型改变时都做某事。仅在指令加载时,我需要知道复选框是否被选中。
    • 您可以使用其他指令:ng-load 和 ng-init。你不应该使用 $timeout。
    • 当然我不想使用$timeout。这就是我问这个问题的原因。要了解此超时为零后的方式,复选框获取值..如果我使用 ng-load 或 ng-init 我错过了指令点..我不想为每个复选框添加 ng-init。
    • 正如我所说,您的指令缺少最大的一点:它可能不会应用于复选框,而是应用于另一种类型的控件,这将使其完全无用。这就是为什么你应该创建一个包含复选框并将 ng-init 和 ng-load 放入其中的指令。这样你就可以做 ,就像在我的 plunkr 中一样。这样您就可以确保您的指令始终应用于复选框。由于 $scope.$apply/$digest 循环的工作方式,您会在超时后获得值。
    • 此外,您的指令除了设置作用域的消息之外什么也没做。我怀疑它对任何事情都有用,除此之外,您还可以使用 ng-init,这不需要您依赖应用/摘要生命周期:docs.angularjs.org/api/ng.$rootScope.Scope
    猜你喜欢
    • 2016-02-25
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2017-08-13
    • 2020-06-21
    相关资源
    最近更新 更多