2017-06-06 106 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>