Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >knockout.mapping与TypeScript和RequireJS

knockout.mapping与TypeScript和RequireJS
EN

Stack Overflow用户
提问于 2014-09-25 08:19:56
回答 2查看 3.3K关注 0票数 2

试图将ko.mapping与TypeScript和RequireJS结合起来理解。据我所知,我可以创建一个视图模型,将其绑定到一个视图,并通过视图模型将一个复杂的对象公开给我的视图。我没办法把这事办好。web上的大多数示例都希望展示如何获取web服务响应并直接绑定它。我正在寻找一个更基本的例子--我只想把一个未绑定的对象映射到屏幕上。我当然可以手动完成,但我认为这个工具正是为了这个目的而设计的.

我有两个需要:

  1. 在初始显示上显示一个值-可能为空
  2. 使用按钮更改值。

我一直在使用一些示例代码作为概念的证明,这是我能想到的最基本的版本。这个想法是用一个按钮呈现一个视图。该按钮的文本应该加载"Hello!“,当单击时将更新为”再见.“。

我想我的视图模型需要两个物体..。

  1. 波霍
  2. 绑定对象,实例化为ko.mapping.fromJS({})

我的理解(这可能是错误的)是,映射将接受POJO并在绑定对象中自动创建POJO的可观察版本。视图绑定到绑定对象。在任何时候,例如单击按钮,我都可以增强POJO,并将其重新加载到绑定对象中,我的视图将相应更新。

我的视图模型是连接的,因为我可以设置断点,并看到他们被击中。由于绑定对象不可用,页面加载失败。如果我从ko.mapping更改为标准的可观测值,它的负载就会很好。

当我考虑ko.mapping的时候,我错过了什么?我的方法有缺陷吗?

基本POJO类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DefaultModel {
    public myField: string;
}
export = DefaultModel;

视图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>TypeScript HTML App</title>
        <script data-main="Application/require-config" src="Scripts/require.js"></script>
    </head>
    <body>
        <h1>TypeScript HTML App</h1>
        <button id="myMethodTest" data-bind="text: boundModel().myField, click: function () { myButton_Click() }" ></button>
    </body>
</html>

视图模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <reference path="../Scripts/typings/knockout/knockout.d.ts" />
/// <reference path="../Scripts/typings/knockout.mapping/knockout.mapping.d.ts" />

import DefaultModel = require("Models/DefaultModel");
import ko = require("knockout");

class DefaultViewModel {
    public basicModelInstance: DefaultModel;
    public boundModel: any;

    constructor() {
        // INSTANTIATE THE BOUND MODEL TO BE A BLANK KO MAPPED AWARE OBJECT
        this.boundModel = ko.mapping.fromJS({});

        // SETUP A BASIC INSTANCE OF A POJO
        this.basicModelInstance = new DefaultModel;
        this.basicModelInstance.myField = "Hello World!";

        // LOAD THE POPULATED POJO INTO THE BOUND OBVSERVABLE OBJECT
        this.boundModel = ko.mapping.fromJS(this.basicModelInstance, {}, this.boundModel);
    }

    myButton_Click() {
        // UPDATE THE POJO
        this.basicModelInstance.myField = "Goodbye Moon...";

        // RELOAD THE POJO INTO THE BOUND OBJECT
        this.boundModel = ko.mapping.fromJS(this.basicModelInstance, {}, this.boundModel);
    }
}
export = DefaultViewModel;

RequireJS配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <reference path="../Scripts/typings/requirejs/require.d.ts" />

require.config({
    baseUrl: "",
    paths: {
        "jQuery": "Scripts/jquery-2.1.1",
        "knockout": "Scripts/knockout-3.2.0.debug",
        "utilities": "Application/utilities",
        "ViewModelMapper": "Application/ViewModelMapper",
        "komapping": "Scripts/knockout.mapping-latest.debug"


    },

    shim: {
        "jQuery": {
            exports: "$"
        },
        komapping: {
            deps: ['knockout'],
            exports: 'komapping'
        }
    },
});

require(["jQuery"], function ($) {
    $(document).ready(function () {
        // alert('dom ready');

        require(["utilities", "knockout", "ViewModelMapper", "komapping"], (utilities, knockout, viewModelMapper, komapping) => {
            utilities.defineExtensionMethods($);
            knockout.mapping = komapping;

            var url = window.location;
            var location = utilities.getLocation(url);
            var urlPath = location.pathname;
            var urlPathWithoutExtension = urlPath.replace(".html", "");

            var viewModel = viewModelMapper.getViewModel(urlPathWithoutExtension);
            knockout.applyBindings(viewModel);
        });
    });
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-25 08:50:32

A)在视图模型代码中,对ko.mapping.fromJS的调用只需要前两个参数。因为它返回绑定模型,所以不需要传递绑定模型。它应该是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.boundModel = ko.mapping.fromJS(this.basicModelInstance, {});

B) viewModel.boundModel不是一个函数,而是一个对象。所以在html中,绑定text: boundModel().myField应该是text: boundModel.myField

C)您误解了绑定的工作方式。一旦您有了绑定模型,就不需要更新"POJO“,然后每次视图模型中的内容发生更改时都重新创建绑定模型。淘汰赛提供的双向数据绑定将使您的视图模型和ui (html)保持同步,因此从那时起您只需要使用视图模型。当您需要使用视图模型中的内容并更新您的"POJO“(仅当您需要更新服务器时)时,您可以使用与ko.mapping.toJS函数相反的ko.mapping.fromJS函数。传入绑定模型,它将返回普通的JS "POJO“对象,删除所有可观察到的对象。

票数 1
EN

Stack Overflow用户

发布于 2014-09-25 16:18:21

我把这个授予了@wired_in,因为它提供了帮助。在这里,我将提供最终解决我的问题的代码的工作版本。

我的理论--如果映射可以获取AJAX调用的结果,并自动将其映射到可观察的位置,为什么任何普通的POJO都不能呢?嗯,可以的!这种基本的能力是解放的。现在,我可以自由地创建模型,而不会用“可观察”来污染它们。模型的行为可以像任何普通的对象,没有特殊的处理。操纵模型以满足需求,然后当需要在视图上表示时,通过ko.mapping.fromJS调用绑定它。

这是最后的解决办法。我会按照我提出的问题的顺序.

基本POJO类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DefaultModel {
    public myField: string;
}
export = DefaultModel;

视图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>TypeScript HTML App</title>
        <script data-main="Application/require-config" src="Scripts/require.js"></script>
    </head>
    <body>
        <h1>TypeScript HTML App</h1>
        <button id="myMethodTest" data-bind="text: boundModel.myField, click: function () { myButton_Click() }" ></button>
    </body>
</html>

视图模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <reference path="../Scripts/typings/knockout/knockout.d.ts" />
/// <reference path="../Scripts/typings/knockout.mapping/knockout.mapping.d.ts" />

import DefaultModel = require("Models/DefaultModel");
import ko = require("knockout");


class DefaultViewModel {
    public basicModelInstance: DefaultModel;
    public boundModel: KnockoutObservable<DefaultModel>;

    constructor() {
        // SETUP A BASIC INSTANCE OF A POJO
        this.basicModelInstance = new DefaultModel;
        this.basicModelInstance.myField = "Hello World!";

        // LOAD THE POPULATED POJO INTO THE BOUND OBVSERVABLE OBJECT
        this.boundModel = ko.mapping.fromJS(this.basicModelInstance);
    }

    myButton_Click() {
        // UPDATE THE POJO
        this.basicModelInstance.myField = "Goodbye Moon...";

        // RELOAD THE POJO INTO THE BOUND OBJECT
        this.boundModel = ko.mapping.fromJS(this.basicModelInstance, this.boundModel);
    }
}
export = DefaultViewModel;

RequireJS配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <reference path="../Scripts/typings/requirejs/require.d.ts" />

require.config({
    baseUrl: "",
    paths: {
        "jQuery": "Scripts/jquery-2.1.1",
        "knockout": "Scripts/knockout-3.2.0.debug",
        "utilities": "Application/utilities",
        "ViewModelMapper": "Application/ViewModelMapper",
        "komapping": "Scripts/knockout.mapping-latest.debug"


    },

    shim: {
        "jQuery": {
            exports: "$"
        },
        komapping: {
            deps: ['knockout'],
            exports: 'komapping'
        }
    },
});

require(["jQuery"], function ($) {
    $(document).ready(function () {
        // alert('dom ready');

        require(["utilities", "knockout", "ViewModelMapper", "komapping"], (utilities, knockout, viewModelMapper, komapping) => {
            utilities.defineExtensionMethods($);
            knockout.mapping = komapping;

            var url = window.location;
            var location = utilities.getLocation(url);
            var urlPath = location.pathname;
            var urlPathWithoutExtension = urlPath.replace(".html", "");

            var viewModel = viewModelMapper.getViewModel(urlPathWithoutExtension);
            knockout.applyBindings(viewModel);
        });
    });
});

结论:

最后,我被困在三件事上.

  1. 我的视图错误地引用了视图模型中的绑定对象。感谢@wired_in在这方面的帮助
  2. 在构造函数中,我传递了太多的参数。感谢@wired_in指出这一点。关于KnockoutJS.mapping的文档在这方面还不清楚。我认为在这里使用1对3参数是可选的。
  3. 在方法myButton_Click中,我需要传递对已经绑定的现有对象的引用(A.K.A.,视图模型中的视图模型)。这是允许更新现有绑定模型的关键。

现在我可以根据封面下的数据来控制我的观点何时会改变。无论数据是来自AJAX调用,还是来自第三方系统的内部计算操作,还是来自上传的文件--不管是什么--我现在可以在视图中看到数据。很酷。

最后,问题--“为什么在未绑定的POJO中有数据?为什么不使用绑定对象并将其作为可观察的对象来操作?”--我认为答案是“可移植性”。我想自由地传递一个普通的对象进出代码库,而不需要特别考虑。将对象标记为可观察对象的概念是框架强加的约束--使绑定成为可能的变通方法。要求在任何地方应用“可观察”属性是不可取的。分离关心宝贝!总之,从我的肥皂盒里.

谢谢@wired_in。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26043433

复制
相关文章
Java集合中对象排序
集合中的对象排序需求还是比較常见的。当然我们能够重写equals方法,循环比較;同一时候Java为我们提供了更易使用的APIs。当须要排序的集合或数组不是单纯的数字型时,通常能够使用Comparator或Comparable。以简单的方式实现对象排序或自己定义排序。
全栈程序员站长
2022/07/08
7720
检查Python对象
编程环境中的对象很象现实世界中的对象。实际的对象有一定的形状、大小、重量和其它特征。实际的对象还能够对其环境进行响应、与其它对象交互或执行任务。计算机中的对象试图模拟我们身边现实世界中的对象,包括象文档、日程表和业务过程这样的抽象对象。 类似于实际的对象,几个计算机对象可能共享共同的特征,同时保持它们自己相对较小的变异特征。想一想您在书店中看到的书籍。书籍的每个物理副本都可能有污迹、几张破损的书页或唯一的标识号。尽管每本书都是唯一的对象,但都拥有相同标题的每本书都只是原始模板的实例,并保留了原始模板的大
张善友
2018/01/22
1.3K0
Javascript中对象如何检查key(键)是否存在
如果要特别测试对象实例的属性(而不是继承的属性),请使用hasOwnProperty:
IT工作者
2022/02/09
26.6K0
vue的$attrs_vue获取list集合中的对象
原文网址:Vue–attrs, listeners–使用/教程/实例_IT利刃出鞘的博客-CSDN博客
全栈程序员站长
2022/09/27
5.2K0
[ Java学习基础 ] Java的对象容器 -- 集合
  当你有很多书时,你会考虑买一个书柜,将你的书分门别类摆放进入。使用了书柜不仅仅使房间变得整洁,也便于以后使用书时方便查找。在计算机中管理对象亦是如此,当获得多个对象后,也需要一个容器将它们管理起来,这个容器就是集合。   集合本质是基于某种数据结构数据容器。常见的数据结构:数组(Array)、集(Set)、队列(Queue)、链表(Linkedlist)、树(Tree)、堆(Heap)、栈(Stack)和映射(Map)等结构。本文将为大家介绍Java中的集合。 一、集合概述   Java中提供了丰富的集
Kevin_Zhang
2018/05/22
1.8K0
PHP检查对象或类中是否存在属性
$obj = \app\common\library\Email::instance(); $obj->p=889; if(isset($obj->p)){ echo 66; }else{ echo 99; } die; isset既可以判断对象的属性是否存在,也可以判断数组的键名是否存在 未经允许不得转载:肥猫博客 » PHP检查对象或类中是否存在属性
超级小可爱
2023/02/20
4.2K0
JS中,如何检查对象是否为数组?
最近开源了一个 Vue 组件,还不够完善,欢迎大家来一起完善它,也希望大家能给个 star 支持一下,谢谢各位了。
前端小智@大迁世界
2021/02/02
7.2K0
JS中,如何检查对象是否为数组?
eclipse快速创建对象的补充的提示
案例: DriverManager.getConnection(url, user, password); 在其后按住“Ctrl+1”就会有提示直接创建new对象,如下: Connecti
兮动人
2021/06/11
4490
eclipse快速创建对象的补充的提示
java8之提取集合中每个对象的属性
要提取属性的话,用Stream中的map,然后使用方法引用,就可以了 例如Student类中有name属性
周杰伦本人
2023/10/12
3120
线程安全集合类中的对象是安全的么?
之前的文章Java并发BUG基础篇中提到过线程安全的集合类如CopyOnWriteArrayList、ConcurrentHashMap等的使用,以及线程安全类的几种创建方法:
FunTester
2020/04/03
6370
mp对象集合in查询
简单说明一下:此处是将入参的list获取到类型,根据表字段和list进行遍历,获取lambda进行取值,然后进行in以及or查询
阿超
2023/02/28
6420
mp对象集合in查询
javalist集合转换数组_集合对象转数组
原链接:https://stackoverflow.com/questions/157944/create-arraylist-from-array
全栈程序员站长
2022/09/25
6460
java8提取对象集合中的一项属性
  java都快出15了,我才开始写8,感觉跟不上时代了[捂脸],如果使用循环的方法提取,比较复杂,代码较多,尝试使用java8提取
彼岸舞
2020/11/03
1.9K0
eclipse中Git的使用
Eclipse从LUNA版本开始默认支持了GIT客户端,可以在导航菜单中windows --> preferences搜索git查看git相关配置。 Eclipse中对于git的操作基本都在右键菜单Team中。
全栈程序员站长
2022/08/04
2K0
eclipse中Git的使用
mybatis查询返回一个对象中带有集合
常用的属性就不说了,特别要注意的是ofType这个要指向各自表的实体类,然后子表的column属性不要和主表重名,一旦重名就会出问题,不知道是不是我配置的问题,希望有大佬指教,反正不重名就可以 接下来就是查询语句了,很简单,只要别名和上面resultMap对的上就ok
星辰sea
2022/10/29
1.9K0
用户代码未处理MetadataException
最近在用EF搭框架的过程中,遇到了很多问题,大部分都是出现在配置文件中,比如说下面这个问题:
全栈程序员站长
2022/08/09
3120
用户代码未处理MetadataException
怎么去掉eclipse对注释的字母语法错误的检查?
操作如下图所示:
黑泽君
2018/10/11
1.2K0
java中的集合
ArrayList和LinkedList的异同? 答:二者都线程不安全,相对线程安全的Vector,执行效率高。此外,ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。
全栈程序员站长
2022/07/18
1.6K0
java中的集合
点击加载更多

相似问题

在Rails3中,可以有一个多部分的form => true和use remote => true吗

22

remote => true和remote: true之间的差异

22

Rails3 + link_to(...,:remote => true) + IE 6/7不起作用

10

用remote=>true阻止Rails link_to吗?

22

:remote=>true的Rails问题

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文