2

オブザーバブル配列を内部的に使用する計算オブザーバブルをバインドしようとしています。ロード中に「読み取り」メソッドが呼び出されます。ただし、テーブルの値が変更されてフォーカスが移動した場合、「書き込み」メソッドは呼び出されません。配列ではなく単純な文字列をラップする単純な計算されたオブザーバブルの場合、「書き込み」メソッドが機能することに注意してください。ただし、このシナリオでは機能しません。Knockout api のドキュメントとオンライン フォーラムを調べましたが、これについては何も見つかりませんでした。誰かアドバイスをお願いできますか?以下はHTMLコードです

        <thead>
        <tr><th>People Upper Case Name</th></tr>
        </thead>
        <tbody data-bind="foreach: uppercasepeople">
        <tr>
           <td ><input type="text" data-bind="value: name"/></td>            
        </tr>
        </tbody>
        </table>

以下はJavaスクリプトコードです

    <script type="text/javascript">


var MyViewModel = function () {

    var self = this;
    var self = this;

    //Original observable array is in lower case
    self.lowercasepeople = ko.observableArray([
    { name: "bert" },
    { name: "charles" },
    { name: "denise" }
]);

    //coputed array is upper case which is data-bound to the ui
    this.uppercasepeople = ko.computed({
        read: function () {
            alert('read does get called :)...yaaaa!!!');
            return self.lowercasepeople().map(function (element) {
                var o = { name: element.name.toUpperCase() };
                return o;
            });
        },
        write: function (value) {
            alert('Write does not get called :(... why?????');
            //do something with the value
            self.lowercasepeople(value.map(function (element) { return element.toLowerCase(); }));
        },
        owner: self
    });


}

ko.applyBindings(new MyViewModel());

Knockout API ドキュメントに示されている例と同様のコードを配置したので、人々は簡単に関連付けることができます。

4

2 に答える 2

0

var MyViewModel = function () {

var self = this;

//Original observable array is in lower case
self.lowercasepeople = ko.observableArray([
{ name: "bert" },
{ name: "charles" },
{ name: "denise" }
]);

self.recententlyChangedValue = ko.observable();

//coputed array is upper case which is data-bound to the ui
this.uppercasepeople = ko.computed({
    read: function () {
        alert('read does get called :)...yaaaa!!!');
        return self.lowercasepeople().map(function (element) {
            var o = { name: element.name.toUpperCase() };
            return o;
        });
    },
    write: function (value) {
        alert('It will be called only when you change the value of uppercasepeople field');
        //do something with the value 

         self.recententlyChangedValue(value);             
    },
    owner: self
});
}
于 2013-02-18T07:03:22.303 に答える
0

あなたが持っている計算されたオブザーバブルは、配列自体のみを扱います。この関数は、値を直接write設定しようとした場合にのみ呼び出されます。uppercasepeople

この場合、person オブジェクト自体で計算された writeable を使用して、名前を観察可能にしたいと思うでしょう。計算された writeable は名前を大文字に変換し、書き込まれると名前 observable に小文字の値を入力します。

于 2013-02-17T03:49:35.060 に答える