这里的javascript noob总数...具有三个文件:剔除,RoomModel和RoomViewModel

房间模型

function RoomModel(name) {
    var self = this;
    self.name = name;
}


RoomViewModel

function RoomViewModel(roomModel) {
    var self = this;
    self.Name = ko.observable(roomModel.Name).toLowerCase();
}


RoomViewModel如何知道RoomModel是什么?

我将它们放在一起放在视图中,但不确定这是否正确...

<body>
<script src="Models/RoomModel.js"></script>
<script src="ViewModels/RoomViewModel.js"></script>
<script type='text/javascript' src='/Scripts/knockout-3.4.0.js'>
    var roomViewModel = new RoomViewModel(new RoomModel('Hello World'));
    ko.applyBindings(roomViewModel);
</script>
</body>

最佳答案

JavaScript没有静态输入系统。相反,它有助于将JS视为具有Duck Typing:“如果变量像鸭子一样行走,而像鸭子一样发出嘎嘎声,那么它一定是鸭子”。

根据您的问题:


  RoomViewModel如何知道RoomModel是什么?


答案将是:如果RoomViewModel构造函数的输入变量具有Name属性,则也可以将其视为有效的RoomModel

换句话说,视图模型不需要知道输入是有效的RoomModel。这取决于来电者。至于View Model构造函数,这同样可以:

var roomViewModel = new RoomViewModel({ Name: 'Hello World' });


从某种意义上说:是的。

作为一个脚注,如果您对该系统不满意,可以研究TypeScript。它向JavaScript添加了更多静态类型化功能,使您可以将输入参数的类型锁定为特定的构造函数(Typescript术语中的“类”)或接口(以使您保留某些鸭子类型)特征)。

08-17 06:08