gpt4 book ai didi

javascript - Angular : directive with bindToController 'loses' data

转载 作者:行者123 更新时间:2023-11-28 00:02:50 25 4
gpt4 key购买 nike

我有 actionButtons 指令:

function actionButtons(){
'use strict';
return {
scope: {},
restrict: 'AE',
bindToController: {
itemId: '@',
itemDescription: '@',
actionsText: '@',
previewAction: '&',
previewText: '@',
editAction: '&',
editText: '@',
removeAction: '&',
removeText: '@'
},
controller: ActionButtonsController,
controllerAs: 'actionButtonsCtrl',
templateUrl: 'src/views/directives/actionButtons.html'
};
}

使用 ActionButtonsController Controller :

/**
*
* @constructor
*/
function ActionButtonsController() {
'use strict';
var viewModel = this;
//not important assertions
}
/**
*
* @type {boolean}
*/
viewModel.hasItemDescription = typeof viewModel.itemDescription === 'string' &&
viewModel.itemDescription.length > 0;
/**
*
* @type {string}
*/
viewModel.previewText = viewModel.previewText || 'preview';
/**
*
* @type {string}
*/
viewModel.editText = viewModel.editText || 'edit';
/**
*
* @type {string}
*/
viewModel.removeText = viewModel.removeText || 'remove';
/**
*
* @type {string}
*/
viewModel.actionsText = viewModel.actionsText || 'Actions';

viewModel.preview = function() {
viewModel.previewAction();
};

viewModel.edit = function() {
viewModel.editAction();
};

viewModel.remove = function() {
viewModel.removeAction();
};
}

以及他的模板的一部分,带有按钮:

<div class="visible-xs-block btn-group" data-dropdown>
<button class="btn btn-block btn-primary" id="{{::(actionButtonsCtrl.itemId)}}" type="button"
data-dropdown-toggle aria-haspopup="true">
{{actionButtonsCtrl.actionsText}} <span class="sr-only" data-ng-if="::actionButtonsCtrl.hasItemDescription">
for {{::(actionButtonsCtrl.itemDescription)}}</span></button>
</div>

这就是我在应用程序中的称呼:

<td class="col-md-3 col-xs-3 text-center">
<div data-action-buttons
data-item-id="{{author.id + '_' + author.name + '_' + author.surname}}"
data-item-description="{{author.name + ' ' + author.surname}}"
data-preview-action="authorCtrl.preview(author)"
data-edit-action="authorCtrl.edit(author)"
data-remove-action="authorCtrl.remove(author)"
></div>
</td>

问题是:正如您从 Controller 代码中看到的,例如 actionsText 不是必需的,如果不存在,它将被设置为 ActionsitemDescription 也不是必需的。但是,如果我指定 itemDescription 它在 HTML DOM 中始终可见,但 Actions 对我来说表现得非常奇怪:它被设置为默认值 Actions,但在 HTML DOM 中不可见。两者之间的区别在于 actionsText 在 Controller 的代码中明确绑定(bind)到 this - 但我认为这是 bindToController 的默认行为,这是当我想在值不存在的情况下设置默认值时我应该做什么。另外,当我调试它时(例如通过调用其中一个函数),actionsText 具有 undefined 值,尽管事实上,如果我在创建它时对其进行调试,它已设置默认Actions 值。它不适用于一次性绑定(bind)(使用 ::)和正常情况。也许是指令代码中 scope: {} 的问题,但我无法弄清楚,我希望得到您的帮助 - 提前谢谢您。 P.S. 我尝试从 Controller 返回 viewModel 变量 - 它没有帮助。 附注2 如果指定 actionsText(如 data-actions-text={{'Something'}}),则效果很好

最佳答案

您正在使用bindToController,它将范围值间接添加到 Controller this上下文。但发生此问题是因为您在 bindToController 表达式中使用了 @ 符号。

每当出现 controllerAsbindToController@ Angular 范围的情况时,都会以截然不同的方式处理这个问题。

实际上,当您在带有 controllerAsbindToController 的独立作用域内的作用域变量上使用 @ 时, Angular 会使用 $observe 在该属性值上给出的表达式上,angular code for same

该解决方案将使用 $timeout 来完成将使用隔离范围值的 @ 获取的所有分配。因为在 $observe 表达式求值后,值会在下一个摘要周期中绑定(bind)。

代码

function ActionButtonsController() {
'use strict';
var viewModel = this;
$timeout(function() {
viewModel.hasItemDescription = typeof viewModel.itemDescription === 'string' &&
viewModel.itemDescription.length > 0;

viewModel.previewText = viewModel.previewText || 'preview';

viewModel.editText = viewModel.editText || 'edit';

viewModel.removeText = viewModel.removeText || 'remove';

viewModel.actionsText = viewModel.actionsText || 'Actions';
})

viewModel.preview = function() {
viewModel.previewAction();
};

viewModel.edit = function() {
viewModel.editAction();
};

viewModel.remove = function() {
viewModel.removeAction();
};
};

这是detailed version answer

关于javascript - Angular : directive with bindToController 'loses' data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31629079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com