【问题标题】:Two way binding with controller in directive with isolated scope在具有隔离范围的指令中与控制器的两种方式绑定
【发布时间】:2017-05-11 02:43:43
【问题描述】:

我正在开发一个指令,当用户单击 UPDATE 时,将显示一个 EmployeeId 字段,并且指令上的 employeeId 字段应在更改时直接绑定到控制器。如果我隔离范围,它不会更改控制器employeeId,如果我不这样做,那么所有指令都会被切换。

Plunker:https://plnkr.co/edit/aq06WnfniN51iR7ZtFLc?p=preview

代码:

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
    $scope.employeeId = 'Josh'
    $scope.employeePin = '1234'

    $scope.updateFields = function() {
        alert(1);
    }
});

app.directive('crudEmp', function($parse) {
    var html =  '<div class="form-inline">\
                    <input type="text" class="form-control"\
                        placeholder="Employe ID"\
                        ng-model="employeeId"\
                        required\
                        ng-show="isEditing"/>\
                    <input type="password" class="form-control"\
                        placeholder="Employe PIN"\
                        ng-model="employeePin"\
                        ng-show="user.AdminSecurity && isEditing"\
                        ng-required="user.AdminSecurity"\
                        disabled/>\
                    <div class="col-md-12 text-right noPadding pt10 operationButtons" id="opBtn">\
                        <div class="col-md-12 noPadding" ng-hide="isEditing">\
                            <button class="btn btn-info" ng-click="toggleEditing()">Edit</button>\
                        </div>\
                        <div class="col-md-12 text-right noPadding" ng-hide="!isEditing">\
                            <button class="btn btn-success mr80 updateBtn" ng-click="ctrl.onClick(); toggleEditing()" ng-disabled="ctrl.valid">Update</button>\
                            <button class="btn btn-warning" ng-click="toggleEditing()">Cancel</button>\
                        </div>\
                    </div>';

    return {
        restrict: 'E',
        template: html,
        replace: true,
        bindToController: {
            employeeId: '=',
            employeePin: '=',
            valid: '=',
            onClick: '&',
        },
//      scope: true,   // When i make the scope true, it doesnt change the EmployeeId defined in the controller
        link: function(scope, element, attr){
            scope.onClick = attr.onClick;

            scope.toggleEditing = function() {
                scope.isEditing = !scope.isEditing;
                if(scope.isEditing){
                    element.closest('form').find(':input:not(.operationButtons button)').attr('disabled', false);
                    var getAllInputs = element.closest('form').find(':input').filter(':visible:enabled');
                    if(getAllInputs[0]){
                        getAllInputs[0].focus();
                    }
                }else{
                    element.closest('form').find(':input:not(.operationButtons button)').attr('disabled', true);
                }
            };
        },
        controllerAs: 'ctrl',
        controller: function($scope) {
            var ctrl = this;

            ctrl.onClick = function() {
                $scope.$eval($scope.onClick);
            };
        },
    };
});

【问题讨论】:

  • 您是否创建了一个服务/工厂来在控制器和指令之间共享数据?
  • 不,我没有,我在指令的属性中传递它们。

标签: angularjs angular-directive


【解决方案1】:

如果我目前了解您,可以通过更改来解决:

    ...
            restrict: 'E',
            template: html,
            replace: true,
            bindToController: {
                employeeId: '=',
                employeePin: '=',
                valid: '=',
                onClick: '&',
            },
    //      scope: true,   // When i make the scope true, it doesnt change 

收件人:

...
        restrict: 'E',
        template: html,
        replace: true,
        scope: {
            employeeId: '=',
            employeePin: '=',
            valid: '=',
            onClick: '&',
        },
    ...

您可以在我的 plunker 中验证行为:https://plnkr.co/edit/Xia8BhlfFJ6mqgLjaoOp?p=preview

【讨论】:

  • 没错,但在你的行为中,我无法从控制器触发 onClick 传递函数。我希望当客户单击“保存”按钮时,从控制器触发一个功能
  • 这行得通,有一个问题,因为我为 onClick 分配了一个变量。泰
  • 顺便说一句。有没有办法将employeeId和employeePin控制器变量绑定到指令,而无需在指令属性中传递它们,例如:employee-id和employee-pin?
  • 我不是 100% 从未真正使用过它,。如果您想要具有相同范围的相同指令但不想使用隔离范围,那么据我所知,您需要大量的自我连接。您可以使用 iElm id 作为别名标识符,以便将不同的值保存在 scope.directiveHashMap[element.id].employeeId 中,这样您就可以制作自己的 mapingOfTheValues。如果您不关心孤立的范围,只需要一个指令 pr 页面。然后这个:plnkr.co/edit/drRRlavV2fEgQDc4Ivaq?p=preview我从来没有做过第一个没有研究的想法。
猜你喜欢
  • 2014-05-26
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
相关资源
最近更新 更多