【问题标题】:Knockout Custom Binding and Running a ViewModel FunctionKnockout 自定义绑定和运行 ViewModel 函数
【发布时间】:2013-10-21 06:39:40
【问题描述】:

我发现了一个自定义绑定,可以在可编辑的 div 中进行可观察的更新。 发生事件时,我无法运行函数。

有人知道我可以对我的自定义绑定“editableText”做些什么吗?在我的 ViewModel 中运行一个函数?

我希望函数“nameChange”在文本更改时运行。

HTML:

<div contenteditable="true" data-bind="event: { change: nameChange }, editableText: firstName"></div>

Javascript:

//Editable Text Custom Binding
ko.bindingHandlers.editableText = {
    init: function (element, valueAccessor) {
        $(element).on('blur', function () {
            var observable = valueAccessor();
            observable($(this).text());
        });
    },
    update: function (element, valueAccessor, allBindingsAccessor, data) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        $(element).text(value);
    }
};

//Knockout ViewModel
function viewModel(){
    var self = this;
    self.firstName = ko.observable();
    self.status = ko.observable();

    self.nameChange = function(){
        console.log("Name has been updated");
        ko.mapping.fromJS("Name has been updated", {}, self.status)
    }

    self.loadName = function(){
        ko.mapping.fromJS("hey", {}, self.firstName)
    }
}

var vm = new viewModel();
ko.applyBindings(vm);
vm.loadName();

JSFIDDLE: http://jsfiddle.net/madscientist1882/urLd2/

【问题讨论】:

标签: binding knockout.js contenteditable


【解决方案1】:

订阅observable 上的更改怎么样? (看看显式订阅 observables)

self.firstNameSubscription = self.firstName.subscribe(function (newValue){
  //do something
});

如果您这样做,您需要在视图模型出现故障时处理订阅

self.firstNameSubscription.dispose();

如果您希望每次输入密钥时都更新 observable,请使用 look here

我个人的意见是使用变量名'self'是probably a bad idea...

【讨论】:

  • 虽然使用 self 作为 global 变量显然是个坏主意,但我不明白为什么将其用作 local 变量.
  • @ebohlman 正如我所说,这是个人意见。然而,这是基于它的原因是它会让你养成一个坏习惯,并且在 Javascript 中比其他语言更容易犯错误和滑出范围。为什么不避免容易避免的错误呢?如果我的同事这样做,我会在代码审查中选择它并在签入前对其进行更改。许多好的 Javascript 编程实践都基于约定,我认为这是其中之一。
猜你喜欢
  • 2013-11-30
  • 1970-01-01
  • 2023-03-12
  • 2014-06-16
  • 2014-03-28
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
相关资源
最近更新 更多