1

基になるデータが変更されたときに更新される JSViews テンプレートに問題があります。これには、基になるデータへのコンバーター関数を使用してデータ リンクされたスパンが含まれます。サーバーへの非同期コールバック後に基になるデータが変更された場合、スパン テキストは更新されません。

マークアップ:

{^{for thedata.myarrayobject}}
    <span data-link="{myconverter:var1:} name{:'theName' + var2}"></span>
{{/for}}

脚本:

$.views.converters({
    myconverter: function (val) {
        switch (val) {
            case 1: 
                return 'Test1'; 
                break;
            case 2: 
                return 'Test2';
                break;
            default: 
                return 'Default';
        }
    }
});

スパンは、data.myarray オブジェクトの値に基づいて、ページの読み込み時に正しく表示されます。たとえば、次の場合:

thedata.myarrayobject[0].var1='1';
thedata.myarrayobject[0].var2='John';
thedata.myarrayobject[1].var1='2';
thedata.myarrayobject[1].var2='Matthew';

次のようにロードされます。

<span name="theNameJohn">Test1</span>
<span name="theNameMatthew">Test2</span>

ただし、非同期コールバック後に基になるデータが変更された場合は、次のようになります。

thedata.myarrayobject[0].var1='2';
thedata.myarrayobject[0].var2='John';
thedata.myarrayobject[1].var1='1';
thedata.myarrayobject[1].var2='Matthew';

スパンテキストはそのままです。

私はjsコードをデバッグしましたが、基になる配列パラメーター「var1」は間違いなく新しい値に設定されています。私は電話してみました:

$.observable(thedata.myarrayobject).refresh(thedata.myarrayobject);

しかし、役に立たない。

基礎となるデータの変更に応じてスパンテキストを調整したいのは明らかです-どんな助けでも大歓迎です!

4

2 に答える 2

2

実際、更新を行うには、新しいデータ (たとえば、Ajax 呼び出しから) を以前のデータとマージするための独自の戦略を選択する必要があります。

ただし、マージは「監視可能な」API を使用して行う必要があります。これにより、JsViews はデータ リンクの更新通知を受け取り、UI を更新します。

したがって、データとシナリオに応じて、次の種類の更新のいずれかを使用できます。

  1. リーフの値を 1 つずつ変更します。

    $.observable(thedata.myarrayobject[0]).setProperty("var1", "2");

  2. 一度に 1 つのオブジェクトの葉の値を変更します。

    $.observable(thedata.myarrayobject[0]).setProperty(newarrayobject[0]);

    (これにより、変更されたプロパティがすべて取得されます)

  3. 新しいオブジェクトで配列全体を更新します。

    $.observable(thedata.myarrayobject).refresh(newarrayobject);

    (これにより、新しいオブジェクト/アイテムが myarrayobject にコピーされます)

  4. myarrayobject を新しいオブジェクトで更新します。

    $.observable(thedata).setProperty("myarrayobject", newarrayobject);

    ここでは、アレイを新しいものに置き換えています...

上記のいずれかまたはそれぞれが、新しいデータ値で更新をトリガーします。

上記の方法はnewarrayobject、以前の .xml にマージする更新されたデータを含む新しいデータ配列をダウンロードしたことを前提としていることに注意してくださいmyarrayobjectnewarrayobjectまたは前の を複製する必要はありませんmyarrayobject

于 2015-09-18T05:00:26.347 に答える
1

上記のBorisMooreがいくつかの質問をした後...私がデータを更新していた方法-上記のように配列パラメーターに直接プッシュするだけです:

thedata.myarrayobject[0].var1='2';
thedata.myarrayobject[0].var2='John';
thedata.myarrayobject[1].var1='1';
thedata.myarrayobject[1].var2='Matthew';

同じ配列を渡していたため、$.observable(...).refresh(...) への呼び出しが機能しませんでした。マークアップを更新するための変更はトリガーされませんでした。

簡単に言えば、配列を新しい配列にコピーし、値を更新してから refresh を呼び出すと、次のように機能します。

var myduparrayobject = thedata.myarrayobject.splice();

myduparrayobject [0].var1='2';
myduparrayobject [0].var2='John';
myduparrayobject [1].var1='1';
myduparrayobject [1].var2='Matthew';

$.observable(thedata.myarrayobject).refresh(myduparrayobject);

問題点:

  1. 配列に対する観察可能な変更のみがマークアップに更新されます。思ったようにオブジェクトデータを更新するだけではありません。

  2. $.observable(...).refresh(...) は、参照されるオブジェクトに変更された配列が渡された場合にのみ機能します。私が行ったように、同じ参照されるオブジェクトを渡します (マークアップに表示されているものとは異なる場合でも) ) は、テンプレート マークアップへの変更をトリガーしません。

于 2015-09-16T20:07:30.683 に答える