0

ノックアウトを始めたばかりで、ページ変更の警告を実装する必要があります。以下はコード スニペットです。ページに変更が加えられた場合に警告としてポップアップするアラートが必要です。

function parseViewModel() {

    var viewModel = JSON.parse(getState());

    viewModel.checking = ko.observable(false);
    viewModel.Slider = new ko.observable(100 - viewModel.Slider);
    viewModel.CausalsList = buildHierarchy(viewModel.Causals);
    viewModel.Causals["-1"] = "Total Marketing Budget";
    viewModel.GeographiesList = ko.observableArray(gl);
    viewModel.Geographies["0"] = "All Geographies";
    viewModel.ProductsList = ko.observableArray(pl);
    viewModel.Products["0"] = "All Products";
    .
    .
    .

    return viewModel;
}

function bindModel() {

    model = parseViewModel();

    ko.dirtyFlag = function (root, isInitiallyDirty) {
        var result = function () { },
        _initialState = ko.observable(ko.toJSON(root)),
        _isInitiallyDirty = ko.observable(isInitiallyDirty);

        result.isDirty = ko.computed(function () {
            return _isInitiallyDirty() || _initialState() !== ko.toJSON(root);
        });

        result.reset = function () {
            _initialState(ko.toJSON(root));
            _isInitiallyDirty(false);
        };

        return result;
    };


    model.dirtyFlag = new ko.dirtyFlag(model);
    model.isDirty.subscribe(function () {
        alert("Page change warning!");
    });

    ko.applyBindings(model, $('#const').get(0));
    ko.applyBindings(model, $('#buttonDiv').get(0));
}

Ryan Niemeyer のブログを参照しました。残念ながら、もう機能していません。洞察をお願いします。

4

2 に答える 2

3

model.dirtyFlag.isDirtyあなたのケースでは、ではなくにサブスクライブしたいと思うでしょうmodel.isDirty

于 2013-07-27T00:37:16.737 に答える
0

これを行う 1 つの方法は、customBinding を使用することです。私もKOにはあまり詳しくありませんが、これはあなたが興味を持っているものかもしれません.

基本的にあなたがすることは:-

ko.bindingHandlers.myFunction = {
    update : function(){
                //do something
             }
}

http://knockoutjs.com/documentation/custom-bindings.html

そして、次を使用して要素で呼び出します:-

<h1 data-bind="myFunction:{}"></h1>

また、それがどのように機能するかを示すjsfiddle。(First Name の値を変更してフォーカスを外すと、customBinding がトリガーされます。)

http://jsfiddle.net/3vuTk

ただし、それがベストプラクティスかどうかはわかりません。

于 2013-07-27T00:34:53.817 に答える