1

私はKnockoutJSを使用しています...

observableArrayビューモデルに映画があります。ユーザーがタイトルで映画を検索すると配列が更新されるため、配列にプッシュされる典型的な json 応答は次のようになります...

{data : [{
    Id: 12345,
    Title: 'Movie1',
    Year: 2010,
    Character: [{
        Name: 'Character1',
        Person: { Id: 1, Name: 'Person1' }
    },{
        Name: 'Character2',
        Person: { Id: 2, Name: 'Person2' }
    }],
    UserMovies: [{
        Id: 8
        IsWatched: false,
        Rating: 3.5,
        UserId: 'e1e9c075-1ded-4e7d-8d30-d5d1fbd47103'
    }]
}]}

各映画のUserMoviesプロパティは、個人的な評価や映画をまだ見たかどうかなど、そのユーザーに固有の情報を表します。

ユーザーがデータベースのコレクションに映画を「追加」できるようにします。UserMovies映画をコレクションに追加すると、その映画の更新されたプロパティを持つ json 応答が返されます。

そのプロパティだけを更新して、ノックアウト テンプレートに保持しようとしています。これが私の現在のビューモデルです...

function viewModel() {
    // private properties
    var self = this;

    // public properties
    self.movies = ko.observableArray([]);
    self.searchValue = ko.observable();

    // public operations
    self.search = function () {
        self.isLoading(true);
        $.getJSON(arguments[0].action, { name: this.searchValue() }, function (data) {
            self.movies(data);
        });
    };
    self.add = function (movie) {
        $.ajax({
            type: 'POST',
            url: arguments[1].currentTarget.attributes[1].value,
            data: JSON.stringify({ movie: movie }),
            contentType: 'application/json',
            dataType: 'json',
            success: function (data) {
                // how to just update UserMovies property and persist to template for the given movie?
            }
        });
    };
}

ko.applyBindings(new viewModel());

プロパティを更新する方法はわかりませんが、データをノックアウト テンプレートに永続化する限り、UserMovies各ムービーのプロパティ自体は監視可能ではないため、更新されてもテンプレートで何も自動的に変更されないためだと思います。

すべてのプロパティを監視可能にするマッピングプラグインについて読んでいます。これで持続性の問題が解決するかもしれませんが、マッピング プラグイン内にあるか、マッピング プラグイン経由UserMoviesであるかにかかわらず、プロパティだけを更新する方法がまだわかりません。observableArray

アップデート

マッピング プラグインを使用してフィドルを作成しました。プロパティだけでなくムービー全体を返すとUserMovies、配列内の項目の更新がはるかに簡単になります。私はそれを機能させるのにいくつか問題があり、UserMoviesプロパティに対する「キー」のマッピングを作成する方法を理解するのに苦労しています。http://jsfiddle.net/cmBd9/3/

4

2 に答える 2

0

ご指摘のとおり、UserMovies プロパティが監視可能ではないという事実は、更新しても UI で何も起こらないことを意味します。それにもかかわらず、(観察できない)UserMoviesを更新する方法は次のとおりです。

self.add = function (movie) {
    $.ajax({
        type: 'POST',
        url: arguments[1].currentTarget.attributes[1].value,
        data: JSON.stringify({ movie: movie }),
        contentType: 'application/json',
        dataType: 'json',
        success: function (data) {
            ko.utils.arrayForEach(self.movies(), function(m) {
              if (m.Id == movie.Id) {
                m.UserMovies = data;
              }
            });
        }
    });
};

間違いなくマッピングプラグインをチェックしてください。私の唯一の懸念は、ドキュメントが最初に JSON からオブジェクトをマップする方法と、後で JSON からオブジェクト全体を更新する方法を示していることです。

ただし、JSON からオブジェクトをマッピングし、後で JSON からそのオブジェクトの一部のみを更新して更新することについては何も言及していないようです。そのため、それが機能するかどうかはわかりません。

問題が発生した場合は、add メソッドのサービス呼び出しでムービー オブジェクト全体を返すようにして、マッピング プラグインが支持するモデルにより厳密に従うことができます。

于 2012-12-18T04:39:11.757 に答える