- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 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
不是必需的,如果不存在,它将被设置为 Actions
。 itemDescription
也不是必需的。但是,如果我指定 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
表达式中使用了 @
符号。
每当出现 controllerAs
、bindToController
和 @
Angular 范围的情况时,都会以截然不同的方式处理这个问题。
实际上,当您在带有 controllerAs
和 bindToController
的独立作用域内的作用域变量上使用 @
时, 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();
};
};
关于javascript - Angular : directive with bindToController 'loses' data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31629079/
我在玩bindToController指令的选项。我偶然发现了使用子作用域与隔离作用域的行为之间看似奇怪的区别。当我使用隔离作用域时,会为指令创建一个新作用域,但对绑定(bind) Controlle
所以我有一个指令,它在创建时应该有一个值。让我们调用指令 MyDirective。要使用它并向它传递一个值,您可以这样做: 我使用的是 TypeScript,所以我想要没有 $scope 的类,为此
我有 actionButtons 指令: function actionButtons(){ 'use strict'; return { scope: {},
我在获取更新 View 的指令时遇到了一些问题。 在我的 Controller 中,我为 的属性设置了初始值。指示。然后,2 秒后,我正在更新 vm.listObjectSelected测试其异步行
因此,我正在阅读有关迁移到 Angular 2.0 的内容,并试图了解指令/组件可以相互通信的更好方式。 我遵循了这里的一些指南,这些指南建议利用基于命名空间的继承在指令之间共享信息。( this )
我正在尝试在指令内绑定(bind)变量,并使用新的 Angular 1.4 bindToController 语法从指令中修改它。 HTML: {{boundVar}} Javascript
从 Angular v1.4 开始,可以这样做: scope: {}, bindToController: { name: "=" } 代替旧的做法: scope: { name: "
我有一个相当简单的 AngularJS 问题,我似乎找不到答案: 我将如何使用 $scope.$watch()在指令 Controller 中同时使用 controllerAs和 bindToCont
我正在使用 Angular 1.5.7 版本。 我有一个指令,它将 Controller 名称和 View 名称作为字符串来分别调用 Controller 。 我无法将用户名绑定(bind)到前一个
我正在学习如何正确使用自定义指令的 bindToController 功能,并想知道如何从指令 Controller 访问您在 bindToController 对象中声明的属性。 var myApp
Update: It must have been something stupid in another part of the code. It works now, so the bindToC
好吧,这真的很烦我。我有一个隔离范围的指令,使用 controllerAs 语法和 bindToController: function exampleDirectiveFactory() {
我已经使用 bindToController 语法创建了一个尽可能简单的指令,由于我所看到的,这导致了信仰的崩溃: function foobar() { return { r
我正在尝试使用 karma 和 jasmine 来测试指令。我正在使用 Angular 1.4,我在 SO 和互联网上搜索了不同的东西,但我无法让它工作。 var angular = require(
我是一名优秀的程序员,十分优秀!