将角度控制器应用于模板
Apply Angular Controller to a Template
所以,我不确定我在问什么,但我想实现这一点:
Index.html:
<div ng-view>
</div>
<script>
angular.module('myApp', ['ngRoute'])
.config(['$routeProvider', function ($routeProvider) {
$routeProvider.when('/', { controller: "HomeController", templateUrl: '/Partials/Home/Dashboard.html' });
$routeProvider.otherwise({ redirectTo: '/' });
}]);
</script>
主页/Dashboard.html:
<h2 class="page-header">{{welcome}}</h2>
<!-- Insert my reusable component here -->
我的可重用组件将驻留在MyComponent/Component.html
中,并使控制器myApp.component.controller
与其关联
因此,我想有效地将可恢复组件放入页面,并将其绑定到我的控制器。所以我有了这个:
.directive('MyComponent', function() {
return {
restrict: 'E',
scope: {
},
templateUrl: '/MyComponent/Component.html'
};
});
那么我现在该如何将我的控制器绑定到它呢?我这样做吗:
.directive('MyComponent', function() {
return {
restrict: 'E',
resolve: function () {
return /* resolve myApp.component.controller */;
},
templateUrl: '/MyComponent/Component.html'
};
});
当指令需要一个控制器时,它会将该控制器作为其链接功能。
.directive('MyComponent', function() {
return {
restrict: 'E',
controller: 'MyController', // attach it.
require: ['MyController','^ngModel'], // required in link function
templateUrl: '/MyComponent/Component.html',
link: function(scope, element, attrs, controllers) {
var MyController = controllers[0];
var ngModelCtlr = controllers[1];
///...
}
};
});
^前缀表示此指令在其父元素上搜索控制器(如果没有^前缀,则该指令将仅在其自身元素上搜索该控制器)。
最佳实践:当您想向其他指令公开API时,请使用控制器。否则请使用链接。
您可以将控制器分配给指令:
.directive('MyComponent', function() {
return {
restrict: 'E',
controller : 'HomeController',
templateUrl: '/MyComponent/Component.html'
};
});
所以我只想在这里澄清一些事情。
/MyComponent/Component.html:
<h2>{{welcome}}</h2>
/mycomponent.direction.js:
.directive('MyComponent', function() {
return {
restrict: 'E',
controller : 'ComponentController',
templateUrl: '/MyComponent/Component.html'
};
});
上面的绑定类似于index.html:
<h2>{{welcome}}</h2> <!-- this is from ng-controller = HomeController -->
<my-component></my-component> <!-- this is scoping from ng-controller = ComponentController -->
这将生成结果
<h2>Hello from MyComponent</h2>
<h2>Hello from MyComponent</h2>
看来ComponentController
已经占据了整个范围。然后我把指令改为:
.directive('MyComponent', function() {
return {
restrict: 'E',
// controller : 'ComponentController',
templateUrl: '/MyComponent/Component.html'
};
});
并将index.html更改为:
<h2>{{welcome}}</h2> <!-- this is from ng-controller = HomeController -->
<div ng-controller="ComponentController">
<my-component></my-component> <!-- this is scoping from ng-controller = ComponentController -->
</div>
这给出了正确的输出:
<h2>Welcome from HomeController</h2>
<h2>Welcome from ComponentController</h2>
然后我再次将指令更改为:
.directive('MyComponent', function() {
return {
restrict: 'A', // <----- note this small change, restrict to attributes
// controller : 'ComponentController',
templateUrl: '/MyComponent/Component.html'
};
});
我将index.html更改为:
<h2>{{welcome}}</h2>
<div ng-controller="ComponentController" my-component></div>
这也产生了所需的输出,只需要较少的代码行。
所以我只是希望这能更好地向人们阐明指令。为了完整性和实现这一点所采取的步骤,我把它放在上面。显然,我从其他答案中得到了一些帮助,这些答案为我指明了正确的方向。
相关文章:
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 如何将返回的值应用于多个不同位置的多个选择器
- ThreeJS将画布中的文本渲染为纹理,然后应用于平面
- 如何使jQuery中的悬停函数单独应用于数据库映像
- 如何将jquery函数仅应用于大屏幕
- 将jQuery事件应用于所有类元素
- 在将绑定应用于控制器之后,是否会发出Angular$scope事件
- 如何在ExtJs中获得将应用于给定类列表的样式
- 将 CSS 应用于禁用的输入按钮
- 如何从应用于正文的css中排除特定的表单
- jQuery+Android.将功能(Touchstart、touchmove)应用于实时加载的内容
- 将敲除绑定应用于模板,并将结果作为字符串获取
- 如何将Angular2管道应用于动态内容
- 动画功能不应用于每个元素
- 仅将JavaScript应用于部分代码(例如菜单)
- 将iframe中的css类应用于主文档
- jQuery:如何在没有for循环的情况下将事件处理程序应用于$('#text'+'任意整数
- 离子事件侦听器在每个屏幕上触发,只想应用于一个控制器
- 将角度控制器应用于模板
- 将控制器应用于没有流星路由的模板