【问题标题】:How do I force a Knockout subscribe to fire when the value doesn't change?当值不变时,如何强制 Knockout 订阅触发?
【发布时间】:2014-08-15 16:50:26
【问题描述】:

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

  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');
}

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

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

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

【问题讨论】:

  • 既然您已经尝试过.valueHasMutated(),那么将observables 声明为ko.observable('').extend({notify: 'always'}); 怎么样?来自here
  • 我对此并不熟悉。我去看看。
  • 另请参阅here,了解有关扩展可观察对象的更多信息。
  • 把它作为一个答案,我会这样标记它。

标签: knockout.js cascadingdropdown knockout-subscribe


【解决方案1】:

既然您已经尝试过.valueHasMutated(),那么将可观察对象声明为ko.observable('').extend({notify: 'always'}); 怎么样?来自here,有关扩展可观察对象的更多信息,请参阅here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-27
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 2017-12-03
    • 2018-08-03
    相关资源
    最近更新 更多