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 变量来存储此指针。在这种情况下,您可以使用 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 回答