【发布时间】:2017-01-22 09:31:29
【问题描述】:
我不喜欢将require: {} 属性作为角度组件的一部分来实现。请允许我用我的示例进行演示。
这是应该获取判断列表的组件/指令。没什么特别的,只是一个简单的工厂调用。
// judgements.component.js
function JudgementsController(GetJudgements) {
var ctrl = this;
ctrl.Get = function () {
GetJudgements.get().$promise.then(
function (data) {
ctrl.Judgements = data.judgements;
}, function (error) {
// show error message
});
}
ctrl.$onInit = function () {
ctrl.Get();
};
}
angular
.module('App')
//.component('cJudgements', {
// controller: JudgementsController,
//});
.directive('cJudgements', function () {
return {
scope: true,
controller: 'JudgementsController',
//bindToController: true,
};
});
我正在尝试实现组件要求属性,以使我可以从上述组件/指令访问ctrl.Judgements,如下所示:
// list.component.js
function ListController(GetList, GetJudgements) {
var ctrl = this;
ctrl.list = [];
ctrl.Get = function () {
GetList.get().$promise.then(
function (data) {
ctrl.list = data.list;
}, function (error) {
// show error message
});
};
//ctrl.GetJudgements = function () {
// GetJudgements.get().$promise.then(
// function (data) {
// ctrl.Judgements = data.judgements;
// }, function (error) {
// // show error message
// });
//}
ctrl.$onInit = function () {
ctrl.Get();
//ctrl.GetJudgements();
};
}
angular
.module('App')
.component('cTheList', {
bindings: {
listid: '<',
},
controller: ListController,
controllerAs: 'ctrl',
require: {
jCtrl: 'cJudgements',
},
template: `
<c-list-item ng-repeat="item in ctrl.list"
item="item"
judgements="ctrl.Judgements"></c-list-item>
<!--
obviously the reference to judgements here needs to change
or even better to be moved into require of cListItem component
-->
`,
});
很好很简单,不涉及魔法。敏锐的读者可能注意到ListController 中的GetJudgement 服务调用。这就是我试图使用 require 属性从 TheList 组件中删除的内容。
原因?其实很简单。我想尽可能地阻止数据库受到判断请求的冲击。这是一个静态列表,实际上没有必要为每个应用实例多次请求它。
到目前为止,我只成功收到以下错误消息:
Error: $compile:ctreq
Missing Required Controller
Controller 'cJudgements', required by directive 'cTheList', can't be found!
谁能看到我做错了什么?
PS:我使用的是 Angular 1.5
PSS:我不介意 cJudgement 的实现方式(指令或组件)。
PSSS:如果有人想知道我尝试过使用jCtrl: '^cJudgements'。
PSSSS:还有多个^s,以防万一。
编辑
@Kindzoku 发布了一个指向the article 的链接,我在发布问题之前已经阅读了该链接。我希望这也有助于理解 Angular 1.5+ 中的 $onInit 和 require。
Plunker
由于大众的需求,我做了一个plunker 的例子。
【问题讨论】:
-
以上错误的意思是,没有使用控制器
cJudgements定义的父html元素,顺便说一句,你必须注入服务而不需要它 -
我不明白你的 $onInit 实现。应该是这样的: this.$onInit = function() { this.method = this.requiredName.requiredMethod() }
-
@entre 该错误仅表示无法找到
cJudgements。没有使用cJudgements定义的父 html。如您所见,它只是一个服务调用的包装器。 -
我想是时候使用重型火炮了。准备 Plunker:D
-
@Kindzoku 哈哈,等到我这样做的时候,我可能会找到解决办法:p 我会尝试在早上整理一个。
标签: angularjs components angular-directive