0

コードについて2つの質問があります。

入力画像が無効になっている(ホバー時にハンドカーソルがない)のに、TreeDivに要素があり(ツリーが存在する)、ノードが選択されている場合、入力画像は無効のままです。有効になっていません。

なぜこれ?

また、どこにも使用されていないviewmodelインスタンスが必要な理由も知りたいです...(著者サイトのコード)

<input type="image" id="CreateSiblingUnit" data-bind="value: selectedUnit,enable: isUnitSelected"  src="~/Content/Images/unitaddsibling.png" title="Create sibling unit"  data-url="@Url.Action("CreateSibling", "Unit")" />

var viewModel = {
                isUnitSelected: ko.observable(false),
                selectedUnit: $('#TreeDiv').children().length > 0 && $("#TreeDiv").dynatree("getActiveNode") != null
            };

ko.applyBindings(viewModel);
4

1 に答える 1

2

ビューモデルでは、

isUnitSelected: ko.observable(false),

isUnitSelectedを初期値がfalseのオブザーバブルとして定義していますが、これをtrueに設定するものは何も表示されません。したがって、バインディング(enable: isUnitSelected)を使用すると、isUnitSelectedの値が変更されるまで無効になります。

ビューモデルの2つのプロパティに少し混乱しています。最初の名前は常にfalseになり、2番目の名前はブール値になるため、「selectedUnit」という名前はあまり意味がありません。

ダイナツリーが何であるかはわかりませんが、おそらく何らかのイベント(ノードが選択されている場合など)にバインドし、それに応じてビューモデルのプロパティを設定する必要があると思います。例えば

// In your view model:
isUnitSelected: ko.observable(false),
selectedUnit: ko.observable()

// In some event handler, update the view model's properties each time a node is clicked
var hasNodes = ($('#TreeDiv').children().length > 0);
var activeNode = null;
if (hasNodes) {
    activeNode = $("#TreeDiv").dynatree("getActiveNode");
}
selectedUnit(activeNode);
isUnitSelected(hasNodes && activeNode !== null);

viewModelは次の行で使用されます:

ko.applyBindings(viewModel);

この場合、viewModelは単なる基本的なJavascriptオブジェクトです。このように少し複雑な(しかし最終的にはより便利な)構文を使用することもできます。これにより、ビューモデル「オブジェクト」のインスタンスを作成できます。

var ViewModel = function() {
    var self = this;

    self.isUnitSelected = ko.observable(false);
    //...
}

ko.applyBindings(new ViewModel());
于 2013-01-06T00:17:03.237 に答える