2017-06-06 454 views
-1

在KnockoutJS,爲什麼我們需要一個視圖模型的可觀測員調用的函數,例如在下面的代碼片段,而retieving currentProfit的值稱爲currentProfit()。任何指針都會有幫助。KnockoutJS調用可觀察性

感謝

var viewModel = { 
     currentProfit: ko.observable(150000) 
    }; 

viewModel.profitStatus = ko.pureComputed(function() { 
     return this.currentProfit() < 0 ? "profitWarning" : "profitPositive"; 
    }, viewModel); 
+2

在此解釋很感興趣:http://knockoutjs.com/documentation/observables.html –

+2

並非所有瀏覽器都支持JavaScript getter和setter(*咳嗽* IE *咳嗽*),因此爲了兼容性,ko.observable對象實際上是函數。 要讀取observable的當前值,只需調用不帶參數的observable即可。在這個例子中,myViewModel.personName()將返回'Bob',而myViewModel.personAge()將返回123. 上面的摘錄回答我的疑問,謝謝隊友 – luckyluke

回答

0

我看你已經找到了why淘汰賽使用它的方式,但它可能是有趣的探索,如果它是可以改變的。特別是因爲主要原因是支持舊版瀏覽器。

下面是您如何在getset內使用observable的默認方法的快速探索。如果您願意,我相信您可以將此擴展爲也使用ko.computedtypeof model[prop] === "function")和ko.observableArrayArray.isArray(model[prop]))。

如果有人有關於Object.defineProperty的更多知識以及如何使subscribe和其他方法可訪問,請隨時添加到此答覆/評論中。就個人而言,我會在淘汰賽的新版本支持這種語法:)

const viewModel = { 
 
    currentProfit: 1500 
 
}; 
 

 
const makeObsGetSet = (model, prop) => { 
 
    const innerObs = ko.observable(model[prop]); 
 
    
 
    Object.defineProperty(model, prop, { 
 
    get: innerObs, 
 
    set: innerObs 
 
    }); 
 
    
 
    return model; 
 
}; 
 

 
// Mutate the vm to have obs. property 
 
makeObsGetSet(viewModel, "currentProfit"); 
 

 
console.log("get without():", viewModel.currentProfit); 
 

 
// Subscribe to show it worked: 
 
// (if anybody knows of an easier way to make subscribe 
 
// accessible from the outside, let me know!) 
 
Object.getOwnPropertyDescriptor(viewModel, "currentProfit").get.subscribe(
 
    v => console.log("New currentProfit value:", v) 
 
); 
 

 
// Write using `= 2000` instead of `(2000)` 
 
viewModel.currentProfit = 2000;
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>