带REST服务的Knockout.js-结合父/子数据

带REST服务的Knockout.js-结合父/子数据,rest,knockout.js,single-page-application,Rest,Knockout.js,Single Page Application,我对击倒非常陌生,但我真的很喜欢它,与旧的手动技术相比,它确实有很大的不同 我目前正在开发一个单页应用程序,用于显示从用户分机拨打的电话。我创建了一些REST服务: GET/extensions-返回当前用户可用的分机号码列表 GET/calls/-返回在给定分机上进行的呼叫列表 在我的SPA中,我想列出每个分机的一张表,显示有关电话的数据,但不确定根据我的视图模型应该采取什么角度 目前,我的想法如下: function extension(extn) { var model = ko.

我对击倒非常陌生,但我真的很喜欢它,与旧的手动技术相比,它确实有很大的不同

我目前正在开发一个单页应用程序,用于显示从用户分机拨打的电话。我创建了一些REST服务:

GET/extensions
-返回当前用户可用的分机号码列表

GET/calls/
-返回在给定分机上进行的呼叫列表

在我的SPA中,我想列出每个分机的一张表,显示有关电话的数据,但不确定根据我的视图模型应该采取什么角度

目前,我的想法如下:

function extension(extn) {
    var model = ko.mapping.fromJS(extn);
    model.calls = ko.observableArray(); // load calls in to here

    return model;
}

function CallsViewModel() {
    var self = this;
    self.extnData = ko.observableArray();

    $.getJSON("/extensions", null, function (data) {
        self.extnData($.map(data, extension));
    });
}
我首先将扩展加载到模型中,然后将调用加载到扩展对象中。但我只是在这个阶段,所以不确定这是否是理想的


对于如何处理这个问题有什么建议吗?我很乐意接受任何级别的评论,包括RESTAPI本身(尽管我认为这方面是合理的)。干杯

与REST服务交互不应该真正改变viewmodel代码的结构方式。希望您将数据访问与viewmodel代码隔离开来,这样就不必担心如何检索它们。您可以用很多方法来实现这一点,但是将它们包装到
服务
对象中是一种非常常见的方法

不太确定这是否是您所追求的,因为您没有给出任何关于数据结构的提示,所以我不能确定。你肯定走在正确的道路上,但我会:

显然,当您实际进行模拟ajax调用时,它们将基于回调


这里的想法是加载扩展立即发生,但是对每个扩展的调用都是按需完成的。这听起来像是你的意思,但并不十分清楚。

嘿,非常感谢你的回答,并为我在某些方面的含糊不清表示歉意——在今天结束之前,这有点让人心烦意乱。你确实把我推向了正确的方向——实际上,我只是确认我不打算在某个疯狂的切线上前进。干杯
var Call = function (data) {
    this.number = ko.observable(data.number);
    this.duration = ko.observable(data.duration);
};

var Extension = function (id) {
    var self = this;
    self.id = ko.observable(id)
    self.calls = ko.observableArray();

    self.callsLoaded = ko.observable(false);
    self.loadCalls = function() {
        var calls = ko.utils.arrayMap(dataService.getCallsMock(self.id()), function (c) {
           return new Call(c); 
        });
        self.calls(calls);
        self.callsLoaded(true);
    };
};

var Viewmodel = function() {
    var self = this;

    var extensions = ko.utils.arrayMap(dataService.getExtensionsMock(), function(e) {
       return new Extension(e); 
    });
    self.extensions = ko.observableArray(extensions);
};