当值没有改变时,如何强制Knockout订阅触发?

Mik*_*lls 7 cascadingdropdown knockout.js knockout-subscribe

我有一组级联下拉列表,用于选择房屋地址.我们按此顺序拆分地址:

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

我正在使用knockout来生成通过REST查询从数据库中提取的下拉列表中的值.我有这个工作得很好,除了一个边缘情况.

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

问题是,当我从第10位切换到第11位时.它们都只有一个后缀"街道",并且只有一个"西方"方向.当我进行更改时,后缀和方向不会更改,这不会触发相应的订阅以提取下一组数据.因此,如果我从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');
}
Run Code Online (Sandbox Code Playgroud)

我一直在尝试从$.trigger('change')在场上执行jQuery 到上面添加的内容.valueHasMutated().我可以写代码,精心检查,如果街道名称变了,但后缀和方向也没有,然后重新加载街道号码,但我想,如果能够保持订阅框架内.

有人能指出我正确的方向要么触发.subscribe()功能还是如何采取另一种方法?

注意:鉴于REST端点位于专用网络中且不可公开,我实际上无法执行JSFiddle.否则我会提供一个.

hun*_*nch 13

既然你已经尝试过.valueHasMutated(),那么如何将可观察量声明为ko.observable('').extend({notify: 'always'});?从这里,看这里有关延长观测的详细信息.