【问题标题】:ngModel not binding in directivengModel 在指令中没有绑定
【发布时间】:2014-02-21 15:49:29
【问题描述】:

我正在创建指令来概括控制从 javascript 输入的数据。

所以我将文本字段的选项指定为:

$scope.textfield = { name:"abcd", label: "abcd", placeholder: "xyz", required: true };

指令为:

<text-input details="textfield" ng-model="abc.variable"></text-input>

指令代码如下:

csapp.directive("textInput", function () {
    return {
        scope: {
            details: '=',
            ngModel: '='
        },
        restrict: 'E',
        template: '<input-display label="{{details.label}}" class="{{details.class}}" required="{{details.required}}">' +
                        '<input type="text" name={{details.name}} placeholder="{{details.placeholder}}" ng-required="{{details.required}}" data-ng-model="ngModel"/>' +
                    '</input-display>'

    };
});

父指令代码如下:

csapp.directive("inputDisplay", function () {
    return {
        scope: {
            label: '@',
            class: '@',
            required: '@'
        },
        transclude: true,
        restrict: 'E',
        template: '<div class="control-group" class="{{class}}">' +
                        '<div class="control-label">{{label || "Text"}} {{ required.toString() === "true" ? "*" : ""}}' +
                        '</div>' +
                        '<div class="controls" ng-transclude>' +
                        '</div>' +
                    '</div>'
    };
});

如果我使用单个指令并合并两个指令的模板,则绑定有效,但如果我使用单独的指令进行布局和输入,则它不起作用。

我曾尝试使用点运算符 ngModel,但它仍然无法正常工作。

【问题讨论】:

  • 你能用相关代码设置一个plunker吗
  • 这是因为你在作用域中创建作用域。也就是说控制器>textInput 指令>inputDisplay 指令。这让我想到了下一点,莱昂纳多·迪卡普里奥可能会开始侵犯你的梦想,所以要小心。

标签: angularjs angularjs-directive angularjs-scope


【解决方案1】:

你应该使用 ngModel 控制器。

在此处查看演示: http://plnkr.co/edit/TULG36?p=preview

myApp.directive("textInput", function() {
    return {
        scope: {
            details: '='                
        },
        require: 'ngModel',
        restrict: 'E',
        template: '<input-display label="{{details.label}}" class="{{details.class}}" required="{{details.required}}">' +
            '<input type="text" name={{details.name}} placeholder="{{details.placeholder}}" ng-required="{{details.required}}"/>' +
            '</input-display>',
        link: function(scope, element, attrs, ngModel){
            var input = angular.element(element[0].querySelector('input'));
            input.bind("input", function(e) {
                scope.$apply(function() {
                   ngModel.$setViewValue(e.target.value);
                });
            });

            scope.$watch(function(){
                return ngModel.$modelValue;
            }, function(modelValue){
                input.val(modelValue);
            });
        }

    };
});

【讨论】:

    【解决方案2】:
    '<input-display label="{{details.label}}" class="{{details.class}}" required="{{details.required}}">' +
                        '<input type="text" name={{details.name}} placeholder="{{details.placeholder}}" ng-required="{{details.required}}" data-ng-model="ngModel"/>' +
                    '</input-display>'
    

    Input-display 包含您的输入,您应该将其用作输入的控制器是指令输入显示控制器。

    【讨论】:

    • 您能否举例说明,无法理解您的观点:(。顺便说一句,谢谢您的回复。
    • 只需在 textInput 指令的模板中添加 details=details 并在 inputDisplay 范围内添加 details: '='
    • inputDisplay 指令没有 details 变量,您应该提供它,因为 transclude 使用 $scope of 指令的编译位置
    猜你喜欢
    • 2019-01-22
    • 2014-12-19
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多