Javascript Knockoutjs:访问可观察对象的属性

Javascript Knockoutjs:访问可观察对象的属性,javascript,ajax,model-view-controller,asp.net-web-api,knockout.js,Javascript,Ajax,Model View Controller,Asp.net Web Api,Knockout.js,我是knockoutjs的新手,我正在学习微软关于如何将knockoutjs与MVC Web API结合使用的教程,位于此处:。本教程中的这一步解释了如何将“Book”对象分配给可观察对象,然后解释了要将对象的属性绑定到html,我将访问AuthorName属性,如下所示: data-bind="text: detail().AuthorName" observable和ajax调用如下所示: self.detail = ko.observable(); self.getBookDetail

我是knockoutjs的新手,我正在学习微软关于如何将knockoutjs与MVC Web API结合使用的教程,位于此处:。本教程中的这一步解释了如何将“Book”对象分配给可观察对象,然后解释了要将对象的属性绑定到html,我将访问AuthorName属性,如下所示:

data-bind="text: detail().AuthorName"
observable和ajax调用如下所示:

self.detail = ko.observable();

self.getBookDetail = function (item) {
    ajaxHelper(booksUri + item.Id, 'GET').done(function (data) {
        self.detail(data);
    });
}

function ajaxHelper(uri, method, data) {
    self.error(''); // Clear error message
    return $.ajax({
        type: method,
        url: uri,
        dataType: 'json',
        contentType: 'application/json',
        data: data ? JSON.stringify(data) : null
    }).fail(function (jqXHR, textStatus, errorThrown) {
        self.error(errorThrown);
    });
}
我的问题是,如果我想从javascript访问AuthorName属性,该怎么办?我以为会是这样,但这似乎不起作用。我不确定这是语法问题还是更复杂的问题:

self.detail().AuthorName

这个示例项目的完整源代码可以在这里下载:

下面有两个带有示例UI的代码片段,它们试图模拟您正在寻找的内容。我怀疑您没有使用apply绑定正确设置视图模型,或者没有调用getBookDetail方法

函数ViewModel(){
self=这个;
self.detail=ko.observable();
self.getBookDetail=函数(){
var book={AuthorName:'foo',Category:'bar'};
自我细节(书);
}
self.getBookDetail();
}
应用绑定(新的ViewModel())


self.detail().AuthorName
应该可以正常工作,但是您需要确保
self.detail()
没有返回
null
或者没有属性
AuthorName
的内容

什么是AuthorName?它是如何分配的?如果它是一个可观测的,你必须像调用函数一样调用它。self.detail().AuthorName()。在标记中,这是由绑定自动完成的,但是从javascript中,您必须手动打开可观察的值。@JasonSpake AuthorName来自JSON数据,它来自我的MVC控制器。一旦到达客户端,整个Book对象将被指定给self.detail。但是,我在尝试通过self.detail().AuthorName访问AuthorName时遇到了问题,我还尝试了javascript中的self.detail().AuthorName(),而不是标记。然后,它应该也能正常工作。我建议您在console.log中记录self.detail()的内容,看看它是否在那里。我的问题更多的是如何从javascript访问AuthorName。它的语法是否与标记中的语法相同?self.detail().AuthorName?