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

时间:2014-08-15 16:50:27

标签: knockout.js cascadingdropdown knockout-subscribe

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

  1. 街道名称(例如,10日,11日,主要)
  2. Street Suffix(例如St,Ave)
  3. 街道方向
  4. 街道号码(门牌号码)
  5. 我正在使用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');
    }
    

    我一直在尝试从在字段上执行jQuery $.trigger('change')到您在上面添加.valueHasMutated()时所看到的内容。我可以编写精心设计的代码来检查街道名称是否已更改,但后缀和方向是否已更改,然后重新加载街道号码,但我尽可能保留在订阅框架内。

    有人能指出我正确的方向来触发.subscribe()功能或如何采取其他方法吗?

    注意:鉴于REST端点位于专用网络中且无法公开,我真的无法执行JSFiddle。否则我会提供一个。

1 个答案:

答案 0 :(得分:13)

由于您已经尝试.valueHasMutated(),如何将可观察量声明为ko.observable('').extend({notify: 'always'});?从here开始,有关扩展可观察量的更多信息,请参阅here