javascript - Knockout JS 数据绑定(bind)不起作用

标签 javascript knockout.js knockout-2.0

当我在 applyBidnigns 行设置调试器时,我可以看到以下内容: enter image description here

所有属性都保留一个实际值,但我无法将它们中的任何一个映射到我的渲染中。表单完全是空的。

绑定(bind)模型:

$(document)
            .ready(function() {
                ko.applyBindings(wqsvm, jQuery('#div_wQualitySearch')[0]);
            });

        function ViewModel() {
            var self = this;
            self.search = ko.observable(new Search());
            self.submit = function() {
                if (validator != null && validator.validate('waterqualitysearch')) {
                    self.search.geolocation = getGeocodeByZip(self.search.geolocation.zip);
                    window.location.href = '#' + self.search.buildUrl() + self.buildUrl();
                }
            };
            self.buildUrl = function() {
                var locHash = encodeQueryData(self);
                return locHash;
            };
        }
        function Search() {
            var self = this;
            self.zip = ko.observable('');
            self.distance = ko.observable(25);
            self.currentPage = ko.observable(1);
            self.pageSize = ko.observable(10);
            self.availableRadiuses = ko.observableArray([25, 50, 100, 200, 250]);
            self.geolocation = ko.observable(new geoLocation());
            self.buildUrl = function () {
                var locHash = encodeQueryData(self);
                return locHash;
            }
            self.initFromUrl = function() {
                    var locHash = window.location.hash.substring(1);
                    var location = JSON.parse('{"' +
                        decodeURI(locHash).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}');
                    self.geolocation(new geoLocation(0, 0, '', location));
                    if (location.zip !== 'undefined')
                        self.zip(location.zip);
                    if (location.distance !== 'undefined')
                        self.distance(location.distance);
                    if (location.currentpage !== 'undefined')
                        self.currentPage(location.currentpage);
                },
                self.initialize = function() {
                    if (window.location.hash) {
                        self.initFromUrl();
                    }
                }
            self.initialize();
        }
    var wqsvm = new ViewModel();

渲染:

<div class="find-form" id="div_wQualitySearch">
    <input type="text" id="txt_QWaterZip" placeholder="ZIP Code" data-bind="value: search.zip">
    <select id="ddl_Radius" placeholder="Radius" data-bind="options: search.availableRadiuses, value: search.distance"></select>
    <a data-bind="click: submit, attr: {'class': 'button dark-blue'}" id="btn-waterSearch">Search</a>
</div>

最佳答案

我将发布答案以在将来帮助其他人。 感谢@haiim770,我能够解决这个问题。

搜索不需要成为可观察的。不过,您仍然可以尝试 value: search().zip 等(这是因为 Knockout 不会自动解包作为表达式一部分的可观察对象,它只会自动解包对可观察对象的直接引用 [如 value: SomeObservable])。底线是,尝试: self.search = new Search();相反。

function ViewModel() {
            var self = this;
            self.search = new Search();
            self.submit = function() {
                if (validator != null && validator.validate('waterqualitysearch')) {
                    self.search.geolocation = getGeocodeByZip(self.search.geolocation.zip);
                    window.location.href = '#' + self.search.buildUrl() + self.buildUrl();
                }
            };
            self.buildUrl = function() {
                var locHash = encodeQueryData(self);
                return locHash;
            };
        }

关于javascript - Knockout JS 数据绑定(bind)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39705963/

相关文章:

javascript - 获取 DOM 元素的宽度?

javascript - 通过类名 [JavaScript] 的 PART 获取元素

javascript - 使用 knockout 创建的 jquery 选择选项

javascript - knockout js 值未绑定(bind)

javascript - 使用剔除可观察数组填充下拉列表

javascript - 如何使用 foreach 绑定(bind)从选择选项传递参数以触发和过滤数组可观察对象

javascript - 箭头函数在没有花括号的情况下运行完美。添加了花括号{ return } 并且它中断了

javascript - 将 .onKeyUp 和 .onChange 与 Javascript DOM 对象一起使用

javascript - Knockoutjs清除组合框中的选定值

javascript - 通过 knockout 数据绑定(bind)获取输入字段中的值