淘汰脏标志代码不工作

时间:2013-07-26 23:04:30

标签: javascript knockout.js

刚开始淘汰赛,需要实施页面更改警告。以下是代码段。如果在页面上进行任何更改,我只需要弹出一个警告作为警告。

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));
}

Rean Ryan Niemeyer的博客。不幸的是,它不再起作用了。有什么见解吗?

2 个答案:

答案 0 :(得分:3)

您希望在您的情况下订阅model.dirtyFlag.isDirty而不是model.isDirty

答案 1 :(得分:0)

一种方法是使用customBinding。我也不熟悉KO,但这可能是你感兴趣的东西。

基本上你要做的是: -

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

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

使用以下方法在您的元素上调用它: -

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

此外,还有一个jsfiddle来展示它是如何工作的。 (如果更改名字的值并将焦点从中移出,则会触发customBinding。)

http://jsfiddle.net/3vuTk

不确定这是否是最好的做法。