- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我正在阅读有关迁移到 Angular 2.0 的内容,并试图了解指令/组件可以相互通信的更好方式。
我遵循了这里的一些指南,这些指南建议利用基于命名空间的继承在指令之间共享信息。( this )
它建议:使用 $scope.container.someFunction() 而不是 $scope.someFunction()。变量也是如此。使用 $scope.container.variable 而不是 $scope.variable。
因此,目前在我的项目中,我几乎没有指令(更多的是父子关系)需要相互通信。
因此,我使用 Angular 1.4 之后的 bindToController 将一个容器从父指令传递到它的所有子指令。
directive ('myDirective', function () {
return {
restrict: 'E',
scope: {},
bindToController: {
container: '='
},
controllerAs: 'ctrl',
templateUrl: 'components/my-page.html',
controller: MyController
};
然后从父指令传递它
<my-directive container="container"/>
由于我有很多变量需要绑定(bind),将所有这些变量移动到容器中并绑定(bind)整个容器是否好?像这样的东西:
$scope.container = {
variable1: ...
variable2: ...
function1: ...
function2: ...
}
还是单独绑定(bind)它们?
bindToController: {
variable1: '=',
variable2: '=',
....
},
此外,我读到我也可以使用链接来绑定(bind),这让我更加困惑。我应该使用下面的链接吗?或 bindToController 如上所述绑定(bind)整个容器?
link: function($scope, $element, $attrs, controller) {
// access controller.container.variable1 here
}
是否有好的设计实践?迁移到 Angular2.0 有什么优缺点和难易程度?
我知道这是一个有点开放性的问题,但一些指导和常见做法会非常有帮助。
最佳答案
使用以下流程:
$scope
相关方法转换为 TypeScript Angular 1.x controllerAs
方法例如:
class ToDoListController {
name: string;
listItems: any[];
newItemName: string;
constructor() {
this.name = "";
this.listItems = [];
}
save() {
}
toggle(listItem: ListItem){
}
}
无需 $scope
依赖即可测试:
module TypeScriptAndAngular.Controllers.Tests {
describe("ToDoListController Tests", () => {
var listScopeMock: Directives.IToDoListScope;
describe("Constructor Tests", () => {
it("Constructor sets defaults as expected", () => {
// Arrange
var name = "A List Name";
listScopeMock = {
name: name
}
// Act
var ctrl = new Controllers.ToDoListController(listScopeMock);
// Assert
expect(ctrl.name).toEqual(name);
expect(ctrl.listItems).toBeDefined();
expect(ctrl.newItemName).toBeUndefined();
expect(ctrl.listItems.length).toBe(0);
});
});
describe("Save Tests", () => {
it("Save does nothing if no task name has been entered", () => {
// Arrange
var ctrl = new Controllers.ToDoListController(listScopeMock);
// Act
ctrl.save();
// Assert
expect(ctrl.listItems.length).toBe(0);
});
it("Save does nothing if task name is empty string", () => {
// Arrange
var ctrl = new Controllers.ToDoListController(listScopeMock);
ctrl.newItemName = "";
// Act
ctrl.save();
// Assert
expect(ctrl.listItems.length).toBe(0);
});
it("Save adds a new item with the specified name", () => {
// Arrange
var taskName = "A new task";
var ctrl = new Controllers.ToDoListController(listScopeMock);
ctrl.newItemName = taskName;
// Act
ctrl.save();
// Assert
expect(ctrl.listItems.length).toBe(1);
expect(ctrl.listItems[0].name).toBe(taskName);
});
});
describe("Toggle Tests", () => {
it("Toggle sets complete to FALSE if it was originally TRUE", () => {
// Arrange
var item = new ListItem("A new item", true);
var ctrl = new Controllers.ToDoListController(listScopeMock);
// Act
ctrl.toggle(item);
// Assert
expect(item.isComplete).toBe(false);
});
it("Toggle sets complete to TRUE if it was originally FALSE", () => {
// Arrange
var item = new ListItem("A new item", false);
var ctrl = new Controllers.ToDoListController(listScopeMock);
// Act
ctrl.toggle(item);
// Assert
expect(item.isComplete).toBe(true);
});
});
});
}
引用资料
关于javascript - 迁移到 Angular 2.0 和 BindToController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29626081/
我在玩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(
我是一名优秀的程序员,十分优秀!