我正在创建一个自定义指令。这里,我使用的是在控制器中定义的itemsList。此itemsList包含我要在页面上显示的所有数据。 这是我的自定义指令
directives.directive('studenttemplate', function($compile) {
return {
restrict: "E",
scope: true,
link: function(scope, element, attrs) {
var htmlcontent = "";
var studentItem = scope.itemsList;
console.log("Inside the Directive", scope.items);
for (var i = 0; i < studentItem; i++){
htmlcontent = htmlcontent
+ "<tr>"
+ "<td>"
+ studentItem[i].name
+ "</td>"
+ "<td>"
+ studentItem[i].mobile
+ "</td>"
+ "<td>"
+ studentItem[i].address
+ "</td></tr>"
}
element.append(htmlcontent)
$compile(element.contents())(scope);
}
}
});
我在undefined
获得scope.itemsList
。但是,当我使用普通的HTML代码时,它工作正常。我不知道是什么原因引起的。
这是我的控制器代码
$scope.items = stuservice.getList(defaultUrl);
$scope.items.then(function(data) {
$scope.itemsList = data.list;
});
任何帮助都会受到赞赏。感谢
答案 0 :(得分:0)
您可能正在运行异步调用来获取数据,同时立即评估该指令。请尝试以下方法:
link: function(scope, element, attrs) {
// Watch the itemsList, then evaluate the directive
scope.$watch('itemsList', function(newVal, oldVal) {
var htmlcontent = "";
var studentItem = newVal;
console.log("Inside the Directive", newVal);
for (var i = 0; i < studentItem; i++){
htmlcontent = htmlcontent
+ "<tr>"
+ "<td>"
+ studentItem[i].name
+ "</td>"
+ "<td>"
+ studentItem[i].mobile
+ "</td>"
+ "<td>"
+ studentItem[i].address
+ "</td></tr>"
}
element.append(htmlcontent)
$compile(element.contents())(scope);
}
答案 1 :(得分:0)
您应该将itemsList
传递给您的指令,该指令在您的标记中定义指令并绑定该属性。
<studenttemplate items-list="itemsList"></studenttemplate>
directives.directive('studenttemplate', function($compile) {
return {
restrict: "E",
scope: {
itemsList: '='
},
link: function(scope, element, attrs) {
if(!angular.isArray(scope.itemsList)) {
return;
}
console.log('studenttemplate got itemsList:', scope.itemsList);
}
答案 2 :(得分:0)
您不需要每次都创建每一行。 ng-repeat
将为您解决问题。在隔离范围内,您需要从itemsList
属性中的父控制器传递您想要的范围变量的item-list
值。 =
符号表示itemsList
对象与控制器双向绑定。
<强>标记强>
<studenttemplate item-list="itemsList"></studenttemplate>
<强>指令强>
directives.directive('studenttemplate', function($compile) {
return {
restrict: "E",
scope: {
itemsList: '='
},
link: function(scope, element, attrs) {
console.log("Inside the Directive", scope.itemsList);
var htmlcontent = "<tr ng-repeat='item in itemsList'><td>item.name</td><td>item.mobile</td><td>item.address</td></tr>"
element.append(htmlcontent)
$compile(element.contents())(scope);
}
}
});