0

ViewModel のチェーンに依存するプロパティの実際の例を持っている人はいますか? コード例は、私が話していることを説明します。

<script type="text/javascript">
    var ViewModel = function () {
        this.SelectedPubCode = ko.observable('@Model.PubCode');
        this.SelectedVersionName = ko.observable('@Model.VersionName');
        this.PubCodes = ko.observable(@Model.PubCodes.ToJavascriptArray());
        this.VersionNames = ko.observable(@Model.VersionNames.ToJavascriptArray());

        this.LoadVersionNames = function(pubCode) {
            var self = this;
            $.ajax({
                type: "POST",
                url: '@Url.Action("LoadVersionNames")',
                data: "pubCode=" + pubCode,
                success: function(data) {
                    self.VersionNames(data);
                    // Trigger chain call (will call SelectedVersionName subscribtion).
                    self.SelectedVersionName('');
                }
            }); 
        };

        this.SelectedPubCode.subscribe(function(newPubCode) {
            // Accessing public variable to call model's method
            model.LoadVersionNames(newPubCode);
        });

        this.SelectedVersionName.subscribe(function(newValue) {
            // Another model's method can be called here.
            alert("Version Name has been changed to '" + newValue + "'");
        });
    };
    // Creating public variable to access it from inside of subscribtion action
    var model = new ViewModel();
    ko.applyBindings(model);
</script>

this.SelectedPubCode.subscribe(function(newPubCode)コールを見てください。これを機能させるには、グローバル変数を使用する必要があります。私が望む動作を達成する他の方法はありますか?

4

1 に答える 1

2

ノックアウト チームは、ビュー モデルで自己変数を使用してこのポインターを格納することをお勧めします。この場合、グローバル変数を使用する代わりに、self を使用して LoadVersionNames 関数を呼び出すことができます。

コードは次のようになります。

<script type="text/javascript">
    var ViewModel = function () {
        var self = this;
        self.SelectedPubCode = ko.observable('@Model.PubCode');
        self.SelectedVersionName = ko.observable('@Model.VersionName');
        self.PubCodes = ko.observable(@Model.PubCodes.ToJavascriptArray());
        self.VersionNames = ko.observable(@Model.VersionNames.ToJavascriptArray());

        self.LoadVersionNames = function(pubCode) {
            $.ajax({
                type: "POST",
                url: '@Url.Action("LoadVersionNames")',
                data: "pubCode=" + pubCode,
                success: function(data) {
                    self.VersionNames(data);
                    // Trigger chain call (will call SelectedVersionName subscribtion).
                    self.SelectedVersionName('');
                }
            }); 
        };

        self.SelectedPubCode.subscribe(function(newPubCode) {
            // Accessing public variable to call model's method
            self.LoadVersionNames(newPubCode);
        });

        self.SelectedVersionName.subscribe(function(newValue) {
            // Another model's method can be called here.
            alert("Version Name has been changed to '" + newValue + "'");
        });
    };
    // Creating public variable to access it from inside of subscribtion action
    var model = new ViewModel();
    ko.applyBindings(model);
</script>
于 2012-08-17T08:00:30.840 に答える