将回调表单指令传递给AngularJS中的控制器函数

时间:2014-03-29 14:52:32

标签: angularjs angularjs-directive angularjs-controller

我有一个指令和一个控制器。该指令在其隔离范围中定义了一个函数。它还引用了控制器中的一个功能。该函数需要回调。但是,当我从指令调用它并传入回调时,回调将作为未定义传递。下面的代码会更清楚:

指令

directive('unflagBtn', ["$window", "api",
    function($window, api) {
        return {
            restrict: "E",
            template: "<a ng-click='unflag(config.currentItemId)' class='btn btn-default'>Unflag</a>",
            require: "^DataCtrl",
            scope: {
                config: "=",
                next: "&"
            },
            controller: ["$scope",
                function($scope) {
                    $scope.unflag = function(id) {
                        $scope.next(function() { //this callback does not get passed
                            api.unflag(id, function(result) {
                                //do something
                                return
                            });
                        });
                    };
                }
            ]
        };
    }
]);

控制器

controller('DataCtrl', ['$rootScope', '$scope', 'api', 'dataManager', 'globals',
    function($rootScope, $scope, api, dataManager, globals) {
        ...
        $scope.next = function(cb) { //This function gets called, but the callback is undefined.
            // do something here 
            return cb ? cb() : null;
        };
    }
]);

HTML

<unflag-btn config="config" next="next(cb)"></unflag-btn>

我在这里读到How to pass argument to method defined in controller but called from directive in Angularjs?,当将参数从指令传递给控制器​​函数时,参数需要作为对象传递。所以我试过这样的事情:

$scope.next({cb: function() { //this callback does not get passed still
    api.unflag(id, function(result) {
        //do something
        return
    });
}});

但那没用。我不确定这是否重要,但是我应该注意,该指令放在一个表单中,该表单位于控制器内部。只是为了说明结构:

<controller>
   <form>
        <directive>
   <form>
<controller>

希望这是明确的,并提前感谢!

2 个答案:

答案 0 :(得分:0)

试试这个

        controller: ["$scope",
            function($scope) {
                $scope.unflag = function(id) {
                    $scope.next({
                        cb: function() { //this callback does not get passed
                            api.unflag(id, function(result) {
                                //do something
                                return;
                            });
                        }
                    });
                };
            }
        ]

答案 1 :(得分:0)

因此,在无法将对象传回控制器之后,我无意中发现了什么错误。发生了什么,(以及我可能应该在问题中提到的,我知道它的相关性)是这个指令unflagbtn的父范围实际上是我拥有的另一个指令的范围,称之为{{1 }}。反过来,secondDirective的范围来自&#34; DataCtrl&#34;。简化代码如下所示:

secondDirective

因此以这种方式传递回调解决了我的问题,因为它回到了控制器。这很丑陋很可能是由于我对角度的理解不足,所以我很抱歉,因为这很可能不是正确的方法,但它解决了我的问题,所以我虽然分享。

干杯,