【发布时间】:2017-11-20 16:45:03
【问题描述】:
我最近接手了我公司创建的 AngularJS 应用程序的开发,目前正在尝试向表格中的单元格添加一个按钮,用户可以将其用作导航按钮,并设置位置它会将您定向到用户的任何一个自定义页面。
在表格指令中,我添加了以下代码:
.directive('appTable', function(fxTag) {
return {
...
template: '...',
controller: function($scope, $element, $compile, Global, fxEvent, fxSearch, NotifyMgr) {
...
var goToPageBtnTmpl = $compile(
'<a href="javascript:;" ng-click="goToPage(target)"' +
'<class="btn btn-xs btn-brand">Go to Page</a>'
);
console.log("goToPageBtnTmpl defined: ", goToPageBtnTmpl);
...
var goToPage = function(target) {
// Code to navigate to the page set by the user
console.log("goToPage button added: ");
};
...
}
}
})
在 ctrl.js 中,有一个 toWidgetObj() 函数,它根据用户在表单上选择/输入的详细信息创建一个小部件:
}).controller('WidgetPickerCtrl', function($scope, $timeout, fxTag, gPresets, appWidget, appUI, pagesPresets) {
...
function toWidgetObj() {
...
var widgetObj = {
name: $scope.widget.name,
label: $scope.widget.label,
attr: angular.copy($scope.widget)
};
switch(widgetObj.name) {
case 'app-table':
...
angular.forEach(widgetObj.table.rows, function(row) {
if(row.length > 0) {
reducedRows.push(row.map(
function(tag) {
if(tag.isTag) {
return {tag: tag.tag, nounit: tag.nounit};
}
if(tag.isBtn) {
var goToPageBtnTmpl = $compile(
'<a href="javascript:;" ng-click=goToPage(target)"' + 'class= "btn btn-xs btn-brand">Go to page</a>'
)
}
}
));
}
});
...
break;
...
}
...
return widgetObj;
}
...
});
当我当前单击表格小部件上的“编辑小部件”按钮时,会打开“编辑小部件”对话框,我会在表格中的单元格中添加一个按钮。然后,当我单击“预览”按钮以使用我在对话框中输入的更改来更新小部件时,我看到来自 directive 的打印语句显示:
goToPageBtnTmpl 定义:publicLinkFn(scope, cloneConnectFn, transcludeControllers, parentBoundTranscludeFn){ assertArg(范围, '范围');
我希望表格显示已按行编译的按钮:
var goToPageBtnTmpl = $compile(
'<a href="javascript:;" ng-click="goToPage(target)"' +
'class = "btn btn-xs btn-brand">Go to page</a>'
)
这会将用户带到我在对话框输入中指定地址的页面。
但是当我点击“预览”时,我实际看到的是显示的表格,而应该显示按钮的单元格实际上显示的是我输入的链接(即我希望它获取的页面地址)用户点击时)。
我在控制台的调试提示按钮添加成功:
标签是一个按钮:
{tag: "pages/userpage1", isTag: false, isBtn: true, nounit: false, units: undefined} 是Btn : 真的 isTag : 错误的 名词单位 : 错误的 标签 : “页面/用户页面 1” 单位 : 未定义
但我实际上并没有看到页面上显示的按钮。
有人对我在这里做错了什么有任何建议吗?
编辑
所以,当我进一步研究时,我想我可能已经找到了按钮不显示的原因:编译按钮的代码写在table指令的controller函数中:
.directive('appTable', function(fxTag) {
return {
...
controller: function(...) {
...
var gotToPageBtnTmpl = $compile(
...
);
所以这是在页面第一次加载时运行的。但是,我试图在页面已经加载之后手动将按钮添加到表格中,并且我用来执行此操作的代码稍后会在相同的 controller 函数中编写:
if(!$scope.noTagAlarm()) {
angular.forEach($scope.config.columns, function(col) {
...
if(col.header.startsWith(":")) {
angular.forEach($scope.config.rows, function(row) {
col.template = function(value, row, metadata) {
goToPageBtnTmpl(value);
}
})
}else{
console.log("column doesn't start with ':' ");
}
...
});
}
我的想法是,由于此代码是在指令的 controller 函数中编写的,因此它可能仅在页面首次加载时运行,而不是在我使用“编辑小部件”对话框编辑小部件时运行,因此 HTML未渲染。
会是这样吗?如果是这样,如何在编辑后重新加载小部件而不刷新整个页面?或者,如果不是,我在这里实际上做错了什么?
【问题讨论】:
-
使用 Chrome 开发者工具 (Inspect Element) 并查看锚标记是否已正确呈现。我看到 ng-click="goToPage(target)" 和 class= "" 之间没有空格。这可能是个问题,但不确定
-
我尝试检查它,但小部件每隔几秒钟就会更新一次——每次更新时,控制台都会刷新,所以我实际上无法及时看到那里有什么......跨度>
-
请包含将编译元素链接到所需范围的代码,然后将其附加到所需元素。
-
我不确定我应该如何/在哪里这样做?
-
我编辑了我的 OP 以说明为什么我认为该按钮未显示。