0

サーバーから ajax 経由でデータを読み込み、この情報をモデルに出力するノックアウト スクリプトがあります。すべてを単純化すると、私のモデルは次のようになります。

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

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

すべてがうまく機能します (私のビューにはサーバーからの情報が取り込まれます)。しかし、必要なのはこの情報を変更することです (たとえば、データをタイムスタンプから人間が読める形式に変更するなど)。

私が理解しているように、それを達成する1つの方法は、計算されたオブザーバブルをノックアウトすることですが、ここでタイムスタンプを必要とせず、更新後にデータを1回変更して使用できるため、これを行う理由がわかりません(計算されたオブザーバブルで目的を達成する理由と方法を教えていただければ幸いです)。

したがって、次の方法で 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

その理由は、観察可能なプロパティ (観察可能な値ではない) を置き換えた場合、すべてのサブスクリプションはまだ古い値を持つ古い観察可能なものになるためです。

500エラーに関しては、クライアント側のエラーではなく、サーバーエラーのように聞こえると述べています。

于 2014-02-20T10:26:41.947 に答える