我有一个指令和一个控制器。该指令在其隔离范围中定义了一个函数。它还引用了控制器中的一个功能。该函数需要回调。但是,当我从指令调用它并传入回调时,回调将作为未定义传递。下面的代码会更清楚:
指令
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>
希望这是明确的,并提前感谢!
答案 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
因此以这种方式传递回调解决了我的问题,因为它回到了控制器。这很丑陋很可能是由于我对角度的理解不足,所以我很抱歉,因为这很可能不是正确的方法,但它解决了我的问题,所以我虽然分享。
干杯,