2014-12-19 34 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

相關問題