次のコードを検討してください。
$(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 にバインドしている変数 (または関数) を先頭に追加しても、そのエラーは発生しません (ただし、それらは空です) 。