10

我有一组用于选择住宅地址的级联下拉列表。我们按以下顺序拆分地址:

  1. 街道名称(例如 10th、11th、Main)
  2. 街道后缀(例如 St、Ave)
  3. 街道方向
  4. 街道号码(门牌号)

我正在使用敲除来生成下拉列表中的值,这些值是通过 REST 查询从数据库中提取的。除了单个边缘情况外,我的工作效果很好。

首先让我告诉你一些关于地址的信息(当它们像这样分开时)。总有街道名称,总有街道号码。后缀和方向并不总是使用。所以我可能有一个 100 Savanna South(Savanna South 是街道名称)或 101 Main St。假设后缀和方向发生变化,我有这些场景工作。

问题是,当我从 10 号切换到 11 号时。它们都只有“Street”后缀,并且都只有一个“West”方向。当我进行更改时,后缀和方向不会更改,这不会触发适当的订阅以提取下一组数据。因此,如果我从 10 日更改为 11 日,门牌号码不会更新。

function AddViewModel() {
/* Address */
self.StreetName = ko.observable('');
self.StreetNames = ko.observableArray([""]);
self.StreetName.subscribe(function (val) {
    if ((val !== undefined && val !== null && val !== '') && val !== viewModel.StreetType()) {
        getStreetTypes(val);
    }
});

self.StreetType = ko.observable('');
self.StreetTypes = ko.observableArray([]);
self.StreetType.subscribe(function (val) {
    if (val !== undefined && val !== null && val !== '') {
        alert("I changed to " + val);
        getStreetDirections(self.StreetName, val);
    }
});

self.StreetDirection = ko.observable('');
self.StreetDirections = ko.observableArray([]);
self.StreetDirection.subscribe(function (val) {
    if (val !== undefined && val !== null && val !== '') {
        getStreetNumbers(self.StreetName, self.StreetType, val);
    }
});

self.StreetNumber = ko.observable('');
self.StreetNumbers = ko.observableArray([]);
self.StreetNumber.subscribe(function (val, e) {
    if (val !== undefined && val !== null && val !== '') {
            $.get('/api/gis/addressview/getaddress',
                { streetName: $('#StreetName').val(), streetType: $('#StreetType').val(), streetDirection: $('#StreetDirection').val(), streetNumber: val },
                function (result) {
                    loadAddresses(result);
                }, 'json');
    }
});
}

// Get the street types
function getStreetTypes(streetName) {
    $.get('/api/gis/cascadingaddress/getstreettypes', { streetName: streetName }, function (result) {
        viewModel.StreetTypes(result);

        // If there is only one street type, load it.
        if (result.length === 1) {
            if (result[0] !== "" && result[0] !== " ") {
                viewModel.StreetType(result[0]);
                viewModel.StreetType.notifySubscribers();
            } else {
                getStreetDirections(streetName, result[0]);
                viewModel.StreetType.notifySubscribers();
            }
        }
    }, 'json');
}

function getStreetDirections(streetName, streetType) {
    $.get('/api/gis/cascadingaddress/getstreetdirections', { streetName: streetName, streetType: streetType }, function (result) {
        viewModel.StreetDirections(result);

        // If there is only one street direction, load it
        if (result.length === 1) {
            if (result[0] !== "" && result[0] !== " ") {
                viewModel.StreetDirection(result[0]);
                viewModel.StreetDirection.valueHasMutated();
            } else {
                getStreetNumbers(streetName, streetType, result[0]);
                viewModel.StreetDirection.valueHasMutated();
            }
        }
    }, 'json');
}

function getStreetNumbers(streetName, streetType, streetDirection) {
    $.get('/api/gis/cascadingaddress/getstreetnumbers', { streetName: streetName, streetType: streetType, streetDirection: streetDirection }, function (result) {
        viewModel.StreetNumbers(result);
    }, 'json');
}

我一直在尝试几件事,从$.trigger('change')在现场做一个 jQuery 到你在上面看到的添加.valueHasMutated(). 我可以编写详细的代码来检查街道名称是否已更改,但后缀和方向没有更改,然后重新加载街道编号,但我会尽可能保持在订阅框架内。

谁能指出我正确的方向来触发该.subscribe()功能或如何采取另一种方法?

注意:鉴于 REST 端点位于专用网络中并且不公开可用,我真的不能做 JSFiddle。否则我会提供一个。

4

1 回答 1

17

既然您已经尝试过了.valueHasMutated(),那么将 observables 声明为怎么样ko.observable('').extend({notify: 'always'});?从这里开始,并在这里查看更多关于扩展 observables 的信息。

于 2014-08-15T19:09:47.987 回答