【问题标题】:Populate AngularJS {{expression}} within ng-repeat using a second array使用第二个数组在 ng-repeat 中填充 AngularJS {{expression}}
【发布时间】:2014-06-18 00:46:59
【问题描述】:

我正在使用 Laravel 和 AngularJS 完全重建我的网站(最初是与 Wordpress 一起破解的)。这是一次巨大的学习经历,我想我快到了,但有一个问题。

在我的网站上,“计划”(或课程)由“单元”组成,“单元”又由“课程”组成。检索这些数据很好,使用 Eloquent 我检索有效的 JSON 就像这个组成的例子......

[
{
    "id": "1", //Scheme Id
    "title": "Sports",
    "description": "This is a Sports course!",
    "units": [
        {
            "id": "1",
            "title": "Tennis",
            "lessons": [
                {
                    "id": "6",
                    "title": "Serving"
                },
                {
                    "id": "7",
                    "title": "Hitting the ball with top-spin"
                }
            ]
        },
        {
            "id": "2",
            "title": "Athletics",
            "lessons": [
                {
                    "id": "1",
                    "title": "Long Jump"
                },
                {
                    "id": "2",
                    "title": "Hurdling Technique"
                }
            ]
        },
        {
            "id": "4",
            "title": "Golf",
            "lessons": [
                {
                    "id": "4",
                    "title": "Pitching"
                },
                {
                    "id": "5",
                    "title": "Putting"
                }
            ]
        }
    ]
}
....
]

另外,对于这样的特定用户,我有一个简单的已完成课程 ID 数组...

[2, 6, 8, 9] ///User has completed lessons with ids of 2,6,8 and 9

在我看来,我正在使用这样的嵌套 ng-repeat 循环......

...
<div ng-controller="SchemesController">
<div ng-repeat="scheme in schemes">
    <h1>{{scheme.title}}</h1>
    <div ng-repeat="unit in scheme.units">
        <h3>{{unit.title}}</h3>
        <div ng-repeat="lesson in unit.lessons">
            <div>{{lesson.title}}: {{status}}</div>
        </div>
    </div>
</div>
</div><!--[end of ng-controller="SchemesController"]-->
....

SchemesController(很简单!)看起来像这样......

   var app = angular.module('schemesApp', []);

   app.controller('SchemesController', function($scope){
    $scope.schemes=jsonData;
   });

问题是我不知道如何填充 {{status}} 字段,我想简单地声明“完成”或“不完整”。我调查了我是否可以像这样将这些信息添加到我的原始数组中......

"lessons": [
            {
                "id": "6",
                "title": "Serving",
                "status": "Complete" //populated somehow
            },
            {
                "id": "7",
                "title": "Hitting the ball with top-spin",

            }
        ]

但我慢慢地无处可去。有没有办法做到这一点(我玩过 underscore.js 并觉得这会有所帮助?)。

或者我是否通过创建和调用 javascript 函数来填充 {{status}}?!?

任何人都可以提供的任何帮助都是不可思议的。我是一名学校老师,出于某种虐待狂的原因,我发现一些编程/网页设计是我业余时间的有趣用途,所以如果这是一个愚蠢的问题,我深表歉意。提前致谢!!!

顺便说一句,如果有人对此问题有更好的“标题”,请告诉我。

【问题讨论】:

    标签: javascript arrays json angularjs laravel


    【解决方案1】:

    我假设您不需要将状态保存回数据库...

    这就是你遇到问题的地方:

    <div>{{lesson.title}}: {{status}}</div>
    

    您确实不需要将状态存储在数据模型中,因为它只是用于演示目的。

    假设您的已完成课程数组定义如下:

    $scope.completedLessons = [1, 2, 3, 4, 5] // Or however you'd assign it
    

    你需要像这样在你的范围内创建一个函数:

    $scope.isLessonCompleted = function(lessonId) {
      return $scope.completedLessons.indexOf(lessonId) > -1;
    };
    

    那你需要把上面的html改成这样:

     <div>{{lesson.title}}: {{isLessonCompleted(lesson.id) && 'Complete' || 'Incomplete'}}</div>
    

    【讨论】:

    • 别忘了回:$scope.isLessonCompleted = function(lessonId) { return $scope.completedLessons.indexOf(lessonId) &gt; -1; };
    • 谢谢...太多 CoffeeScript
    • 感谢你们 (@Scottux) 的帮助。我想知道我也隐约遵循它,而不仅仅是复制和粘贴!此代码调用“isLessonCompleted”函数 - 从循环中传递当前的课程 ID。然后这个 id 位于 completedLessons 数组中,如果它位于,则 'indexOf' 返回一个正数。我理解正确吗?希望最后一个菜鸟问题 - 'isLessonCompleted' 函数在哪里 - 在控制器内部,作为服务/工厂......?再次干杯!
    • 您对一切都非常了解。 isLessonCompleted 进入附加到$scope 的“SchemesController”。在 Angular 中从 DOM 调用的所有方法都必须存在于包装它们的范围内。如果这是整个应用程序中的常见功能,您应该编写一个实用服务来提供isLessonCompleted 函数,您可以将其注入多个控制器/指令中。在任何一种情况下,您仍然需要将一个方法附加到包装您的元素的作用域,以便您可以从 DOM 调用它
    • 你是绝对的明星,但如果你能告诉我它应该去哪里?设置此jfiddle - 认为我仍然将函数放在错误的位置,因为它破坏了我放置的所有内容!!!我是一名老师,我从来没有期待过给别人打勾……
    【解决方案2】:

    如果课程也是一个模型,并且每个课程都应该有一个状态,它不是表格中的列/字段,而是您将添加逻辑来确定的内容,您可以通过添加以下内容来添加自定义模型访问器给你的models/Lesson.php:

    // Append custom accessor attributes
    protected $appends = ['status'];
    
    public function getStatusAttribute() {
        // Add logic here
        return 'Complete';
    }
    

    这样,当您使用 Eloquent 检索数据时,您还会看到 status 属性作为对象的一部分,因此您可以像往常一样访问它 $lesson-&gt;status (PHP) 或 lesson.status ( JS)。

    有关更多信息,请参阅accessors and mutators 上的 Laravel 官方文档

    【讨论】:

    • 嗨大卫,我正在使用code$schemes = Scheme::with( array( 'units', 'units.lessons') )->get();@ 生成初始数据987654328@我如何将课程ID传递到逻辑部分进行查询?
    • 您好,在处理模型时,您可以访问访问器中的所有对象数据,因此您只需执行$this-&gt;id
    • 非常好 - 我现在也可以这样工作。抱歉,我不能接受两个答案,因为它们都是出色的解决方案,感觉有几种方法可以实现结果。再次干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2018-04-11
    • 2017-05-21
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多