【问题标题】:Bind dropdown list of another object绑定另一个对象的下拉列表
【发布时间】:2016-02-12 22:17:03
【问题描述】:

我将从描述期望的结果开始我的问题:

我想构建一个输入表单以使用淘汰赛 JS 发布到我的 API,但是我要输入的 Entity 对象具有外键,因此我需要为外表中的所有选项提供一个选择选项。

课程视图模型

var lessonRegisterViewModel;

function Lesson(id, name, teacher, room, subject, startTime, endTime) {
    var self = this;
    self.Id = ko.observable(id);
    self.Name = ko.observable(name);
    self.Teacher = ko.observable(teacher);
    self.Room = ko.observable(room);
    self.Subject = ko.observable(subject);
    self.StartTime = ko.observable(startTime);
    self.EndTime = ko.observable(endTime);
    self.addLesson = function() {
        var dataObject = ko.toJSON(this);
        $.ajax({
            url: '/api/Lessons',
            type: 'post',
            data: dataObject,
            contentType: 'application/json',
            success: function(data) {
                lessonRegisterViewModel.lessonListViewModel.lessons.push(new Lesson(data.Id, data.Name, data.Teacher, data.Room, data.Subject, data.StartTime, data.EndTime));
                self.Id(null);
                self.Name('');
                self.Teacher('');
                self.Room('');
                self.Subject('');
                self.StartTime('');
                self.EndTime('');
            }
        });
    }
}

function LessonList() {
    var self = this;
    self.lessons = ko.observableArray([]);
    self.getLessons = function() {
        self.lessons.removeAll();
        $.getJSON('/api/Lessons', function(data) {
            $.each(data, function(key, value) {
                self.lessons.push(new Lesson(value.id, value.name, value.teacher, value.room, value.subject, value.startTime, value.endTime));
                console.log(self);
            });
        });
    };
    self.removeLesson = function(lesson) {
        $.ajax({
            url: '/api/Lessons/' + lesson.Id(),
            type: 'delete',
            contentType: 'application/json',
            success: function() {
                self.lessons.remove(lesson);
            }
        });
    }
}
lessonRegisterViewModel = {
    addLessonViewModel: new Lesson(),
    lessonListViewModel: new LessonList()
};
$(document).ready(function() {
    // bind view model to referring view
    ko.applyBindings(lessonRegisterViewModel);
    // load lesson data
    lessonRegisterViewModel.lessonListViewModel.getLessons();
});

我们得到的 JSON 示例:

[  
 {  
  "id":1,
  "name":"Lesson 1",
  "teacher":{  
     "id":3,
     "firstName":"Sophie",
     "lastName":"Adams",
     "emailAddress":"teacher3@foo.com"
  },
  "classroom":{  
     "id":1,
     "name":"Great Hall"
  },
  "subject":{  
     "id":4,
     "name":"jQuery"
  },
  "startTime":"2016-02-10T09:30:00",
  "endTime":"2016-02-10T10:30:00"
},
{  
  "id":2,
  "name":"Lesson 2",
  "teacher":{  
     "id":4,
     "firstName":"Tristan",
     "lastName":"Sanchez",
     "emailAddress":"teacher4@foo.com"
  },
  "classroom":{  
     "id":2,
     "name":"Room 1A"
  },
  "subject":{  
     "id":3,
     "name":"SQL"
  },
   "startTime":"2016-02-10T09:00:00",
  "endTime":"2016-02-10T10:30:00"
}
]

所以基本上我是在插入一个课程,其中包括

名称
老师
房间
主题
开始时间
结束时间

我需要离开,并为数据库中的所有教师提供下拉列表,我还需要为房间和科目执行此操作。我为每个单独的实体都有工作视图模型,没有依赖关系,所以我可以在物理上完成教师、房间和主题的所有 CRUD。

欢迎任何关于如何实施的建议。

【问题讨论】:

  • 您将需要一个数组(可能是可观察的)来存储您想要下拉的每一项内容。所以所有教师的列表,所有房间的列表,所有科目的列表。你能明白吗?
  • @RoyJ 如何将其构建到该视图模型中?
  • lessonRegisterViewModel.teachers: ko.observableArray() 似乎是合理的。

标签: javascript jquery angularjs ajax knockout.js


【解决方案1】:

您似乎没有“我无法让它做我想做的事”之类的问题,而更多的是关于哪些东西适合您的模型的心理障碍。所以让我建议一种不同的思维方式。

您构建的是主要数据对象的完整数据模型。但是您的目标是构建一个应用程序,该应用程序需要该数据模型,但也需要其他东西,所有这些都在其视图模型中。

视图模型完全由视图指定:您需要准确实现视图将使用的一组东西。因此,首先编写带有数据绑定的 HTML。如果您的应用程序将有一个需要房间列表的 <select> 项目,请继续假设您的视图模型中存在这样的成员并进行绑定。

一旦您以这种方式布置了应用程序,您就已经完全指定了您的视图模型。您已经创建了一个需要实现的接口(所有视图模型成员)。应用程序——而不是数据——定义了视图模型。因此,从应用程序开始,将数据建模留给实施阶段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2016-05-02
    • 2018-10-19
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多