1

したがって、次のように、KnockoutJS を使用して複数のビュー モデルを操作しています。

function firstViewModel() {
    var self = this;
    self.dataArray = ko.observableArray([
        { title: "title1", theData: "data1" },
        { title: "title2", theData: "data2" },
        { title: "title3", theData: "data3" },
    ]);
};

function secondViewModel() {
    var self = this;
    self.addData = function() {
        firstViewModel.dataArray.push({ title: "newTitle", theData: "newData" });
        // trying to trigger dataArray in firstViewModel, doesn't work
    }
};

ko.applyBindings(new firstViewModel(), document.getElementById('first'));
ko.applyBindings(new secondViewModel(), document.getElementById('second'));

次に、次のようなもの:

<div id="first" data-bind="with: dataArray">
    <ul data-bind="foreach: $data">
        <li data-bind="text: theData"></li>
    </ul>
</div>
<div id="second">
    <button data-bind="click: addData">add</button>
</div>

このように構成されている理由は、3 番目のビュー モデルがあり、要素が DOM で重複しているためです。これを機能させる方法もわかりませんでした。

構造を保持し、firstViewModel を secondViewModel 内で参照する方法はありますか? firstViewModel.theData.push("newData"); 明らかに機能しませんが、何をしようとしているのかをさらに明確にするために含めると思いました。

私は KO の初心者です - ばかげた質問でしたら申し訳ありません。

編集:私はそれを手に入れたようです!

firstViewModel から「self」を削除すると動作します...

dataArray = ko.observableArray([
    { title: "title1", theData: "data1" },
    { title: "title2", theData: "data2" }
]);

それから

self.addData = function() {
    dataArray.push({ title: "newTitle", theData: "newData" });
}

「自己」を削除することの結果があるかどうかはまだわかりませんが、これまでのところ機能しています。

4

2 に答える 2

1

個人的には、モデルを分離したままにし、パブリッシュ/サブスクライブ パターンを使用して相互に通信できるようにすることを好みます。ノックアウトJSを使用した変数依存関係に対する私の回答を参照してください

さらに、その道をたどりたい場合は、ノックアウトポストを見て同じことを達成することもできます.

于 2013-03-08T09:02:05.727 に答える
0

最初のビューモデルの参照を渡すことができます:

function firstViewModel() {
    var self = this;
    self.dataArray = ko.observableArray([
        { title: "title1", theData: "data1" },
        { title: "title2", theData: "data2" },
        { title: "title3", theData: "data3" },
    ]);
};

function secondViewModel(firstViewModel) {
    var self = this;
    self.addData = function() {
        firstViewModel.dataArray.push({ title: "newTitle", theData: "newData" }); // doesn't work
    }
};

var firstVm = new firstViewModel();
var secondVm = new secondViewModel(firstVm);
ko.applyBindings(firstVm, document.getElementById('first'));
ko.applyBindings(secondVm, document.getElementById('second'));
于 2013-03-07T21:30:54.390 に答える