1

私はノックアウトを使用しており、MVVM 構造を維持しようとしており、オブジェクトが相互に依存するようにしようとしています。

これが私が現在持っているものです、優しくしてください、私はまだこれを学んでいます:

モデル、ViewModel、サービスの定義:

var App = window.App || {};

(function(ns, $, ko) {
    ns.Models = {};
    ns.ViewModels = {};
    ns.Services = ns.Services || {};

    //Service def
    ns.Services.SearchService = function() {
        this.SearchByName = function(name, callback) {
            $.get("/api/SearchByName/" + name, function(d){
                callback(d);
            });
        };
    };

    //Model Def
    ns.Models.SearchResultModel = function(json) {
        var self = this;

        ko.mapping.fromJS(json, {}, self);
    };

    //ViewModel def
    ns.ViewModels.SearchResultsViewModel = function() {
        var self = this;

        self.dataService = new ns.Services.SearchService();
        self.SearchResults = ko.observableArray();

        self.GetSearchResultsByName = function(name){
            self.dataService.SearchByName(name, function(d) {
                $.each(d, function(i, e) { self.SearchResults.push(new ns.Models.SearchResultModel(e)); });
            });
        };
    };
}(App, jQuery, ko));

そして、私は現在それを次のように使用できます:

var vm = new App.ViewModels.SearchResultsViewModel();

vm.GetSearchResultsByName("Doe");

ko.applyBindings(vm, document.getElementById("search-results-form"));

これは私の出発点に過ぎずko.applyBindings(...)、ViewModel のどこかにあるはずです。

それで、私はこれに対して正しい方向に進んでいますか、それとも完全に間違っていますか?

4

1 に答える 1

1

何も変わったことはありません。あなたが間違っていることがなければ、言うべきことはあまりないので、答えるのが難しい質問です...

一つ気になったのは、

$.get("/api/SearchByName/" + name, function(d){
    callback(d);
});

に置き換える必要があります

$.get("/api/SearchByName/" + escape(name)).done(callback);

name無効な URL 文字が含まれている可能性があり、コールバックをラップする理由がないため、エスケープする必要があります。(一般に、この式function (x) { f(x) }は単純な式に不要な間接参照を追加しているだけfです。)

関数では、特に他の場所での命名が非常に冗長であるため、適切なGetSearchResultsByName名前よりもわかりやすい名前dを付けます。

于 2013-08-28T17:40:58.157 に答える