有没有办法在knockout 3.0中手动更新observable?

时间:2014-05-21 07:55:18

标签: knockout.js

我正在寻找一种手动更新observable的方法。我检查了following question但是当我尝试做类似的事情时,我无法达到我的预期。

我出于以下目的需要它。在我的真实代码中,我有类似的东西(包括JS fiddle)。真正的代码要大得多,我试图制作一个可重现的例子,它也没有真正代表我试图解决的问题:

HTML

<button data-bind="click: changeLang">Change</button>
<div data-bind="foreach: last">
    <div data-bind="text: lang[$data]"></div>
</div>

JS

lang = {1: "eine", 2: "zwei"};

function getRandomLang(){
    var tags = [
        {1 : 'one', 2 : 'two'},
        {1 : 'eine', 2 : 'zwei'}
    ];
    return tags[Math.round( Math.random() )];
}

function AppViewModel() {
    var self = this;
    this.last = ko.observableArray([1, 2, 2]);
    this.changeLang = function(){
        lang = getRandomLang();
        //self.last.valueHasMutated();
        console.log(lang);
    }
}

ko.applyBindings(new AppViewModel());

我希望它在用户点击按钮时更改语言。这正是我想手动更新observable的原因。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

您将变量'lang'设置为可观察

var lang = ko.observable({1: "eine", 2: "zwei"});

然后,在你的方法中,

lang(getRandomLang());

这就是你更新observable的方法。知道你想要做什么会更容易,因为我不确定这是否会给你想要的结果。它会更改lang的值,并更新直接绑定到lang的任何内容,但大多数时候observable属性会包装用于显示的基元。

您需要创建一个代表您的UI的模型,您的数据将在该模型中显示。然后,您在数据更改时更改这些值(通过单击,ajax调用等...)