Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从视图模型中引用模型类型?_Javascript_Knockout.js - Fatal编程技术网

Javascript 如何从视图模型中引用模型类型?

Javascript 如何从视图模型中引用模型类型?,javascript,knockout.js,Javascript,Knockout.js,总的javascript noob在这里。。。有三个文件:knockout、RoomModel和RoomViewModel 房间模型 RoomViewModel RoomViewModel如何知道RoomModel是什么 我把它们都放在视图中,但也不确定这是否正确 <body> <script src="Models/RoomModel.js"></script> <script src="ViewModels/RoomViewModel.js">

总的javascript noob在这里。。。有三个文件:knockout、RoomModel和RoomViewModel

房间模型 RoomViewModel
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>

var roomViewModel=new roomViewModel(new RoomModel('Hello World'));
ko.应用绑定(roomViewModel);

我在这里尝试将MVVM的最简单版本放在以下步骤中

  • 创建模型。在我们的例子中,它是roomModel。我将其标记为可观察,只是为了使其具有交互性

  • 创建模型实例,即roomModelObject,以便使用新关键字创建

  • 在我再次使用pureComputed的地方创建ViewModel,只是为了理解目的

  • 最后创建ViewModel的新对象,并通过ko.applybinding将其与视图绑定

  • 同样的事情也可以通过不同的方式实现

    //1。数据模型
    var roomModel=功能roomModel(名称){
    var self=这个;
    self.firstName=ko.observable(名称);
    }
    //2. 创建模型的实例
    var roomModelObject=新roomModel(“O.O”);
    //3. 这是我的数据模型
    var ViewModel=函数(){
    this.fullName=ko.pureComputed(函数(){
    返回roomModelObject.firstName()+“-Computed”;
    },这个);
    };
    // 4. 结合
    应用绑定(新的ViewModel())
    
    
    名字:


    你好JavaScript没有静态键入系统。相反,它有助于将JS理解为“如果变量像鸭子一样走路,像鸭子一样嘎嘎叫,那么它一定是鸭子”

    根据你的问题:

    RoomViewModel如何知道RoomModel是什么

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

    换句话说,视图模型不需要知道输入是有效的RoomModel。这取决于打电话的人。对于视图模型构造函数,这同样很好:

    var roomViewModel = new RoomViewModel({ Name: 'Hello World' });
    
    从某种意义上说:的确如此


    作为一个脚注,如果你对这个系统感到不安,你可以看看打字稿。它向JavaScript添加了更多的静态类型特性,允许您将输入参数的类型锁定到特定的构造函数函数(“类”在Typescript术语中)或接口(允许您保留一些duck类型特性).

    创建
    roomModel
    outside viewModel的实例,并在viewModel函数内部访问该实例错误!不是很好,很难,在这里工作很好#InstanceShareing.@supercool谢谢分享。只是想让事情变得简单。roomModel实例不会给出错误,只需检查代码段即可。是的,很好,它不会给出任何错误,但我指的是更大的图片。我所担心的是OP可能会在外部创建一个实例,就像你在
    (2)
    中指出的那样,如果app'n变得更大,这会导致不期望的结果。最好将步骤2移动到viewModel中,使实例vm特定。干杯
    <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>
    
    var roomViewModel = new RoomViewModel({ Name: 'Hello World' });