2014-12-19 47 views
0

这应该是一个简单的问题,但我无法弄清楚如何去做或找到正确的答案。我试图实现changeTracker here,但我有一个viewModel函数,而不仅仅是一个变量。我目前使用knockoutjs如何间接调用applybindings和viewmodel函数

var viewModel = function() { 
    // code 
} 

,并使用

var vm = new viewModel(); 
ko.applyBindings(vm); 

如何纳入changeTracker到我的应用程序应用绑定?我试图

var vm = new changeTracker(viewModel()); 

var vm = new changeTracker(new viewModel()); 

但既不工程。该changeTracker小提琴HTML是:

<p>Text property: <input data-bind="value: someTextProperty" /></p> 
<p>Bool property: <input type="checkbox" data-bind="checked: boolProperty" /></p> 
<p>Array items count: <span data-bind="text: arrayItems().length"></span> <button data-bind="click:addItem">Add</button></p> 

<hr/> 

<p>Something has changed? <b data-bind="text: tracker().somethingHasChanged() ? 'YES' : 'NO'"></b></p> 
<button data-bind="click: tracker().markCurrentStateAsClean, enable: tracker().somethingHasChanged"> 
    Mark current state as clean 
</button> 

和JavaScript是:

function changeTracker(objectToTrack, hashFunction) {  
    hashFunction = hashFunction || ko.toJSON; 
    var lastCleanState = ko.observable(hashFunction(objectToTrack)); 

    var result = { 
     somethingHasChanged : ko.dependentObservable(function() { 
      return hashFunction(objectToTrack) != lastCleanState() 
     }), 
     markCurrentStateAsClean : function() { 
      lastCleanState(hashFunction(objectToTrack)); 
     } 
    }; 

    return function() { return result } 
} 

var viewModel = { 
    someTextProperty: ko.observable("Hello"), 
    boolProperty: ko.observable(false), 
    arrayItems: ko.observableArray([]), 

    addItem : function() { this.arrayItems.push("Another") } 
}; 
viewModel.tracker = new changeTracker(viewModel); 
ko.applyBindings(viewModel); 

回答

1

我改变了的jsfiddle是使用一个构造函数和它的作品没有问题。您将changeTracker附加到viewModel,您不使用作为绑定viewModel返回的changeTracker实例。

var ViewModel = function() { 
    this.someTextProperty = ko.observable("Hello"); 
    this.boolProperty = ko.observable(false); 
    this.arrayItems = ko.observableArray([]); 

    this.addItem = function() { this.arrayItems.push("Another"); }; 
}; 
var viewModel = new ViewModel(); 
viewModel.tracker = new changeTracker(viewModel); 
ko.applyBindings(viewModel); 
+0

呃,我真的为此而战,是吧?谢谢 - 这很好! – sfors 2014-12-19 14:43:39