0

我有一个淘汰脚本,它通过 ajax 从服务器加载数据并将此信息输出到模型中。如果为了简化一切,我的模型如下所示:

function ArticleViewModel() {
    var self = this;
    this.articleInfo = ko.observable();

    this.getArticle = function(id) { 
        $.get("/router.php", { articleId: id }, self.articleInfo, 'json');
    };
};

一切正常(我的视图中填充了来自服务器的信息)。但我需要修改这些信息(例如将数据从时间戳更改为人类可读格式)。

据我了解,实现它的一种方法是通过淘汰计算 observables,但我没有看到这样做的原因,因为我在这里永远不需要时间戳,我可以在更新后更改我的数据并使用它(如果我是错了,我很高兴听到为什么以及如何使用计算出的 observables 来实现我想要的)。

因此,我尝试通过以下方式更改有关 ajax 请求的数据(一切都相同,但 ajax 调用有回调):

$.get("/router.php", { type : 'mail' }, function(i){
    var d = new Date(i.date);
    self.articleInfo = {
        date: d.toString(),
        title: i.title
    };
}, 'json');

我在页面上没有错误,但没有显示任何信息。当我转到其他页面时,我看到一个警告:TypeError {stack: (...), message: "500 Error get /#Home Property 'articleInfo' of object #<ArticleViewModel> is not a function"}

我究竟做错了什么?

4

1 回答 1

2

我猜这self.chosenMailData是一个可观察的,如果是的话,你应该将它设置为一个函数,self.chosenMailData(newValue); 而不是一个属性self.chosenMailData = newValue; //this will not work。如果它是不可观察的,那么当然,任何绑定都不会被更新,因为他们不知道值已经改变。

原因是如果你替换 observable 属性(而不是 observable 值),所有订阅仍将是旧的 observable,它仍然具有旧值。

关于错误,它指出500这听起来像是服务器错误,而不是客户端错误。

于 2014-02-20T10:26:41.947 回答