javascript - 如何忽略用户未完成的更改?

标签 javascript knockout.js observable

我的 View 模型中有一个 ko.observable,它附加到输入。当用户更改该输入的值(每个字符)时,我运行 AJAX 调用,从后端下载建议。

当用户选择其中一个建议时,我想用所选值填充输入,但不发送 AJAX 调用。但是设置 observable 的值仍然会触发事件并调用附加到 textInput 绑定(bind)的函数。

如何在不触发 textInput 的情况下设置 observable 的值?

示例代码:

var name = ko.observable();
name.subscribe(nameChanged);

var nameChanged = function() {
    someService.post(name(), success, failure);
}

var someAction = function() {

    name("Test"); // I don't want to trigger AJAX call here
}
<input type="text" data-bind="textInput: name" />

最佳答案

另一种选择是使用计算的可观察量作为中介。 ajax 函数可以在计算的写入事件中触发,以便直接写入 observable 绕过它。

function viewModel(){
    var self = this;
    
    self.realName = ko.observable('test');
    
    self.Name = ko.computed({
        read: function(){
            return self.realName();
        },
        write: function(value){
            self.realName(value);
            nameChanged(value);
        }
    });
    
    function nameChanged(newName) {
        console.log("name changed:", newName);
    }
    
    self.modifyName = function(){
        self.realName(self.realName() + 'z');
    }
}

ko.applyBindings(new viewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>


<input type="text" data-bind="textInput: Name" />
<br />
<button data-bind="click: modifyName">Modify</button>

关于javascript - 如何忽略用户未完成的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46956074/

相关文章:

javascript - 将 HTML Div 放入 PouchDB

javascript - 在 Knockout 中设置动态填充选择的值

javascript - 如何在不使用react-router的情况下知道页面刷新之前正在渲染哪个组件?

javascript - 如何在页面上单击一次打开多个 URL?

javascript - Leaflet:尝试使用 Cluster 插件时未捕获类型错误:L.markerClusterGroup 不是函数

javascript - 使用 Knockout 自定义绑定(bind)更新 JSTree

javascript - Knockout ObservableArray 未在 UI 中更新

swift - RXSwift 更新单个元素

angular - RxJS - 每次收到新值时发出整个数组

javascript - RxJs 运算符在每次迭代结束时无条件执行