javascript - 仅在系统修改时禁用输入

标签 javascript jquery knockout.js knockout-3.0

此代码执行搜索并显示结果。我想有条件地禁用 input。我正在使用 knockout 来控制何时禁用 input

要求:

  1. input 在系统设置时被禁用。
  2. 不应禁用用户输入。

在下面的代码中,来自 readDatabase() 的输入效果很好。如果用户输入家乡/昵称 input 然后跳出然后 input 禁用。如何修复此代码以满足第二个要求?

更新

我不反对从 jQuery 获得一些帮助。我不想完全放弃我的 View 模型绑定(bind)。

Fiddle

HTML

Name: <input type="text" data-bind="value: userInput, valueUpdate: 'input'" /><br />
Hometown: <input type="text" data-bind="value: Hometown, disable: Hometown" /><br />
NickName: <input type="text" data-bind="value: Address, disable: Address" />

JavaScript

 function MyViewModel() {
         var self = this;
         self.userInput = ko.observable();
         self.Hometown = ko.observable();
         self.Address = ko.observable();             

         self.userInput.subscribe(function () {
             readDatabase(self);
         });
     }
     ko.applyBindings(new MyViewModel());

function readDatabase(self){
    if(self.userInput().substring(0,1) == "a"){
        self.Hometown("A town");
        self.Address("A address");
    }
    else {
        self.Hometown("");
        self.Address("Other address");
    }
}

最佳答案

你可以使用 extender提供一个指示数据来源的标志:

ko.extenders.isServerSet = function (target, value) {
    target.isServerSet = ko.observable(value);
    return target;
};

function MyViewModel() {
    var self = this;
    self.userInput = ko.observable();
    self.Hometown = ko.observable().extend({
        isServerSet: false
    });;
    self.Address = ko.observable().extend({
        isServerSet: false
    });;
    self.userInput.subscribe(function () {
        readDatabase(self);
    });
}
ko.applyBindings(new MyViewModel());

function readDatabase(self) {
    if (self.userInput().substring(0, 1) == "a") {
        // don't overwrite user-provided values
        if (!self.Hometown()) {
            self.Hometown("A town");
            self.Hometown.isServerSet(true);
        }
        if (!self.Address()) {
            self.Address("A address");
            self.Address.isServerSet(true);
        }
    } else {
        self.Hometown("");
        self.Address("Other address");
    }
}
Name: <input type="text" data-bind="value: userInput, valueUpdate: 'input'" /><br />
Hometown: <input type="text" data-bind="value: Hometown, disable: Hometown.isServerSet" /><br />
NickName: <input type="text" data-bind="value: Address, disable: Address.isServerSet" />

Updated fiddle

关于javascript - 仅在系统修改时禁用输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23450228/

相关文章:

javascript - 创建n :m objects using json and sequelize?

javascript - 在条件表达式中不必要地使用 bool 文字

Javascript 添加多个 if - window.location.hostname

javascript - 过早退出 Qualtrics 中的循环和合并 block

jquery - 如何更改此jQuery小部件(为jQueryUI 1.7编写),使其与jQueryUI 1.8一起使用

jquery - 如何将一个 ajax 数据源与多个 JQuery 数据表一起使用

javascript - 如何在 django 1.6.5 中执行 JavaScript

javascript - knockout 可观察数组。在多个 View 模型之间共享

knockout.js - cleanNode() 可以用来清理绑定(bind)吗?

knockout.js - 使用 Knockout.js 的动态表