$parent
を使用して試してみて、何が起こるか見ています。
実際にはko.applyBindings(MapApplication)
をko.applyBindings()
に変更してみてください。同じように動作します。
何が起こっているのは、locations
がWindowの子機能のように動作しており、それ自身の親であるMapApplication
が認識されないということです。これは、MapApplication
を初期化しておらず、作成前に初期化することができないためです。
ボーナス - このようにコードを変更してみてください:
self.showCoord = function(obj) {
console.log(obj.coord);
console.log(self);
}
と '自己' の値を確認してください。
バインドする正しい方法はこのようになります:あなたは生命維持を使用したい場合は
var MapApplication = function() {
// member function
self = this;
var map;
self.locations = ko.observableArray([
{name: 'Museum', coord: {lat: -37.669012, lng: 144.841027}},
{name: 'Ariport', coord: {lat: -37.669012, lng: 144.841027}}
]);
self.showCoord = function(obj) {
console.log(obj.coord);
}
};
var init = function() {
ko.applyBindings(new MapApplication());
};
$(init);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<div class="places">
<ul data-bind="foreach: locations">
<li data-bind="click: $parent.showCoord, text: name"></li>
</ul>
</div>
更新 、関数がバインドしようとしないはずですそれ自体はオブジェクトの1つをバインドする必要があります。したがって、カプセル化関数を追加してMapApplicationをオブジェクトにする必要があります。 thisを参照してください。これにより、必要に応じて複数のオブジェクトをhtmlの異なる部分にバインドすることもできます。ここではそれがどのように見えるかです:答えレイ用
var applyBinding = function(){
var MapApplication = {
locations : ko.observableArray([
{name: 'Museum', coord: {lat: -37.669012, lng: 144.841027}},
{name: 'Ariport', coord: {lat: -37.669012, lng: 144.841027}}
]),
showCoord :function (obj) {
console.log(obj.coord);
}
};
ko.applyBindings(MapApplication);
}();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<div class="places">
<ul data-bind="foreach: locations">
<li data-bind="click: $parent.showCoord, text: name"></li>
</ul>
</div>
出典
2017-11-05 02:54:38
Ray
おかげで。あなたが提案した正しい方法がわかりますが、モジュールパターンとIIFEを使用してコードを整理しようとしていました。 –
@AmolBorgaonkar更新の回答 – Ray
ありがとうございます –