我有角度控制器,它被分解成一个指令。
在该指令中,原始代码试图调用一个仍然驻留在父控制器中的函数,但声称它没有定义,所以我现在认为它是范围问题。
目前,该指令中的代码为
setMessageState(false, true, "Problem obtaining statement");
其中setMessageState在主控制器中定义 - 如何启用此指令以伸出仍然调用该函数。
编辑: 根据要求,可以提供更多代码。这是我的指令.js
(function () {
'use strict';
//Define the Controller
angular
.module("tpAccStatus")
.directive("tpAccStatusTransactionRow", tpAccStatusTransactionRow);
function tpAccStatusTransactionRow() {
return {
scope: {
trans: "=tpAccStatusTransactionRow",
accountNumber: "="
},
restrict: "A",
replace: true,
templateUrl: "tpAccStatusTransactionRow.directive.html",
bindToController: true,
controller: "tpAccStatusTransactionRowCtrl",
controllerAs: "transCtrl"
};
}
})();
控制器为:
(function () {
'use strict';
//Define the Controller
angular
.module("tpAccStatus")
.controller("tpAccStatusTransactionRowCtrl", tpAccStatusTransactionRowCtrl);
//Inject any dependencies.
//We don't need scope injecting as we are using the Controller as Syntax
tpAccStatusTransactionRowCtrl.$inject = ["$scope", "tpAccStatusService", "nsgLogger"];
//Implement the Controller
function tpAccStatusTransactionRowCtrl($scope, tpAccStatusService, logger) {
//////////////////////// Public Interface //////////////////////////////////////////////
//Ensure there are no issues with the transient nature of the this pointer in Javascript
var vm = this;
vm.busy = false;
vm.requestStatement = requestStatement;
vm.documentLocation = "";
////////////////////////////////////////////////////////////////////////////////////////
//Activate the controller to populate the view model with any set up data
activate();
///////////////////////////////////////////////////////////////////////////////////////
//Retrieve the Administration top Level View Model from the information from the server
function activate() {
}
// get document
function requestStatement() {
if (vm.documentLocation != "") {
window.location = vm.documentLocation;
}
else {
if ((vm.trans.DocumentNumber != null || vm.trans.DocumentNumber != 'none')) {
vm.busy = true;
//setBusyState(true);
return tpAccStatusService
.requestStatement(null, null, vm.accountNumber, vm.trans.DocumentNumber)
.then(requestStatementCompleted, requestStatementErrored);
} else {
logger.error("No Accounts Selected", "Analysis Statement");
}
}
}
function requestStatementErrored(error) {
vm.busy = false;
setMessageState(false, true, "Problem obtaining statement");
}
function requestStatementCompleted(guid) {
vm.busy = false;
vm.documentLocation = "/download/" + guid;
window.location = vm.documentLocation;
}
}
})();
你可以看到对父控制器中保存的函数setMessageState()的引用:
function setMessageState(showSuccess, showError, message) {
vm.showSuccessMessage = showSuccess;
vm.showErrorMessage = showError;
vm.message = message;
}
答案 0 :(得分:0)
它不起作用,因为父控制器中的函数可能也会扭曲成函数。
您尝试做的与此类似。这也行不通。
(function (){
function hello (){
console.log("hello");
}
})();
(function (){
hello();
})()
关于隔离范围的整个想法不是在指令之外的任何东西上传递,除了通过参数传递到范围的东西。在您的情况下,trans
和accountNumber
。
所以你有几个选择。
yourFn = '&'
$scope.$parentScope.setMessageState
在内部控制器中访问它。实际上这是最糟糕的解决方案,因为你根本不需要一个孤立的范围。