2013-03-07 75 views
0

重新考虑了我的Angular应用程序通过工厂服务传递基本数据。现在突然间ng-repeat不会向页面输出任何内容,它根本不会运行,并且我不会收到错误消息!发生了什么?ng-repeat不做任何事情

<ul ng-repeat="section in sections"> 
    <li class="section_title {{section.active}}" > 
     {{section.name}} 
    </li> 
    <ul> 
     <li class="tutorial_title {{tutorial.active}}" ng-click="loadFromMenu([$parent.$index, $index])" ng-repeat="tutorial in AppData.section.tutorials"> 
      {{tutorial.name}} 
     </li> 
    </ul> 
</ul> 


    var Tutorials = angular.module('Tutorials', ['functions', 'tutorials']); 

Tutorials.factory("AppData", function(){ 
    return { 
     sectionNumber: 0, 
     tutorialNumber: 0, 
     questionNumber: 0, 
     sections: sections 
    } 
}) 

Tutorials.run(function(AppData){loadFromMenu([0,0, true], AppData);}) 

function loadFromMenu (tut, AppData) { 
    if (tut[1] === AppData.tutorialNumber && tut[0] === AppData.sectionNumber && !tut[2]) {//if clicked on already playing tut 
     return; 
    } 
    if (tut[1] !== undefined && tut[0] !== undefined) { 
     AppData.tutorialNumber = tut[1]; 
     AppData.sectionNumber = tut[0]; 
    } 
    var section = AppData.sections[tut[0]]; 
    for (var x in AppData.sections) { 
     AppData.sections[x].active = "inactive"; 
     for (var y in AppData.sections[x].tutorials){ 
      AppData.sections[x].tutorials[y].active = "inactive"; 
     } 
    } 
    section.active = "active"; 
    section.tutorials[tut[1]].active = "active"; 
    //$scope.$apply(); 
    AppData.questionNumber = 0; 
    if (AppData.sectionNumber === 1){ 
     conjugationController(); 
    } 
}; 
+0

你可以发布你的控制器和'loadFromMenu'吗? – 2013-03-07 18:15:02

+0

loadFromMenu()是这里唯一与标记相关的控制器,我发布了它。原本我在身体部位有一个大控制器,其他一切都发生在那里,我摆脱了这一点,它停止工作。 – Tules 2013-03-07 18:19:11

回答

2

基于您的代码,你的问题是,你实际上不是使用控制器。一个控制器就是我们如何以编程方式访问范围,我们从中分配我们从服务中获得的范围。观点也与示波器相关联。所以当你说ng-repeat="section in sections"时,它正在寻找当前范围sections上的一个属性。在大多数情况下,这将对应于您的控制器中说$scope.sections = ...的内容。我在你的代码中看不到这样的东西。以下是它应该如何工作。

<div ng-controller="MainCtrl"> 
    <ul ng-repeat="section in sections"> 
    <li class="section_title {{section.active}}" > 
     {{section.name}} 
    </li> 
    <ul> 
     <li class="tutorial_title {{tutorial.active}}" ng-click="loadFromMenu([$parent.$index, $index])" ng-repeat="tutorial in AppData.section.tutorials"> 
     {{tutorial.name}} 
     </li> 
    </ul> 
    </ul> 
</div> 

(PS:嵌套的UL你的方式是不是真的有效的HTML,你会希望把内UL在LI)

现在我不知道外面什么存在ul,所以我只是让它成为div,我们在那里告诉查看哪个控制器分配给页面的那一部分。所以现在我们的控制器必须将这些变量放在示波器上:

Tutorials.controller('MainCtrl', function (AppData) { 
    $scope.sections = AppData.sections; 
}); 

现在它会工作。至于loadFromMenu函数的其余部分,您希望将其中的大部分移植到您的控制器,但我不确定您要如何处理该run块或loadFromMenu函数。因此,这是一个总体原则:服务数据的通用操作应该发生在服务中。

随意发表评论与更多的信息,我会更新这个答案,但ngRepeat不起作用的原因是因为你没有控制器,你的sections变量永远不会被分配到范围。

+0

似乎我第一次就对了! – Tules 2013-03-07 19:05:42