0

次のコードを検討してください。

    $(document).ready(function () {
        var menuView = function() {
            var self = this;
            this.blancos = ko.observableArray([]);

            this.load_blancos = function() {
                $.getJSON("{% url api_template_list_create %}", function (data) {
                    ko.mapping.fromJS(data, {}, self.blancos);
                })
            };

            this.init = function() {
                self.load_blancos();
            };

            this.init();
        };

        ko.applyBindings(new menuView(), document.getElementById('blancos_menu'));
    });

そして、このHTML:

    <ul class="dropdown-menu" id="blancos_menu">
    <li><a href="{% url template_planning %}">Create new</a></li>
    <li class="divider"></li>
    <span data-bind="text: $root.blancos"></span>
    <!-- ko foreach: $root.blancos -->
    <li>
        <a href="#" data-bind="text:name"></a>
    </li>
    <!-- /ko -->
    </ul>

ko: foreach 関数は実行されません (つまり、リスト項目が生成されません)。前のスパンに "[object Object],[object Object]" が表示されます (テスト用です)。

非常に奇妙な理由で、行<span data-bind="text: $root.blancos"></span>をに変更する<span data-bind="text: blancos"></span>と、ko: foreach 関数が実行され、さまざまなリスト項目が表示されます。

驚いたことに、blancos が定義されていないためバインドできないという JavaScript エラーが表示されます。(しかし! スパンにはまだテキスト "[object Object],[object Object]" が含まれています)。

私は本当にそれを回避できません。これを調べてくれてありがとう。

ちなみに、JSON 呼び出しで返されるデータは次のとおりです。

[{"id": 1, "name": "123"}, {"id": 2, "name": "test_wzzob"}]

アップデート

変化

ko.mapping.fromJS(data, viewModel);

の中へ

ko.mapping.fromJS(data, {}, self.blancos);

確かにトリックを行いますが、まだエラーがあります

Uncaught Error: Unable to parse bindings.
Message: ReferenceError: blancos is not defined;
Bindings value: foreach: blancos   

同じことが他のプロパティまたはメソッドにも当てはまります。$root を使用して HTML にバインドしている変数 (または関数) を先頭に追加しても、そのエラーは発生しません (ただし、それらは空です)

4

3 に答える 3

1

ドキュメントは言う:

// Every time data is received from the server:
ko.mapping.fromJS(data, viewModel);

ただし、View Model の代わりに observableArray を指定します。

ko.mapping.fromJS(data, {}, self.blancos);

この方法を試してください:

ko.mapping.fromJS({ blancos: data }, {}, self);
于 2013-02-18T12:49:57.803 に答える
0

$root.blancos ではなく、blancos だけを使用するとどうなりますか? blancos は、ページのその部分にバインドしているビュー モデルのプロパティであるため、ルートは必要ありません。

<li data-bind="foreach: blancos">
    <a href="#" data-bind="text:name"></a>
</li>
于 2013-02-18T12:29:02.837 に答える
-1
ko.applyBindings(new menuView(), document.getElementById('blancos_menu'));

これを

ko.applyBindings(new menuView(),$("#blancos_menu")[0]);

なぜあなたはこれを使用していますか?

<span data-bind="text: $root.blancos"></span>
    <!-- ko foreach: $root.blancos -->

あなたが使用することができます

<ul data-bind="foreach: blancos">
<li data-bind="<ARRAY ELEMENT IN blancos>"></li>
</ul>
于 2013-02-18T12:28:58.697 に答える