Knockout.js 当在装有RequireJS的模块中使用淘汰观测值时,我可以';t更新值

Knockout.js 当在装有RequireJS的模块中使用淘汰观测值时,我可以';t更新值,knockout.js,requirejs,amd,Knockout.js,Requirejs,Amd,我是新手,在装有requirejs的模块中使用可观察对象时遇到问题 代码非常简单,使用html中声明的viewmodel工作。当我使用require加载viewmodel时,observables变量的行为类似于一个函数,因此我必须使用括号来访问变量。但是,当我尝试使用输入更改值时,什么也没有发生。此外,当我从回调函数向可观察数组添加值时,UI不会更新 有一种方法可以加载模块并继续使用不带括号的变量 我尝试使用构造函数和共享对象实例,但问题仍然存在 index.html <div data

我是新手,在装有requirejs的模块中使用可观察对象时遇到问题

代码非常简单,使用html中声明的viewmodel工作。当我使用require加载viewmodel时,observables变量的行为类似于一个函数,因此我必须使用括号来访问变量。但是,当我尝试使用输入更改值时,什么也没有发生。此外,当我从回调函数向可观察数组添加值时,UI不会更新

有一种方法可以加载模块并继续使用不带括号的变量

我尝试使用构造函数和共享对象实例,但问题仍然存在

index.html

<div data-bind="component: 'cmp'"></div>
<script>
    (document).ready(function () {
         ko.components.register('cmp', {require: '../Models/cmp'});
         ko.applyBindings();
    });
<script>
/Models/cmp.html

<p>First name: <strong data-bind="text: firstName">todo</strong></p>
<p>Last name: <strong data-bind="text: lastName()">todo</strong></p>
<select data-bind="options: sel()" class="form-control" id="sel"></select>
<p>First name: <input data-bind="value: firstName" /></p>
<p>Last name: <input data-bind="value: lastName()" /></p>
名字:待办事项

姓氏:todo

名字:

姓氏:

结果:

名字:函数c(){if(0…)

姓氏:Doe


我猜您正在index.html文件中加载require.js和knockout.js。ko在index.html中使用,因此它必须在全局范围内。如果是这种情况,knockout将加载两次,并可能导致与您描述的类似问题

无论如何,我会在index.html文件中使用require入口点,并将ko作为依赖项注入

<html>
<head>
<title>test</title>
</head>
<body>
<script src="require.js"></script>
<div data-bind="component: 'cmp'"></div>
<script>
    require(["knockout-3.4.0"], function(ko) {
        ko.components.register('cmp', {require: 'Models/cmp'});
        ko.applyBindings();
    });
</script>
</body>
</html>
cmp.html

<p>First name: <strong data-bind="text: firstName">todo</strong></p>
<p>Last name: <strong data-bind="text: lastName">todo</strong></p>
<select data-bind="options: sel()" class="form-control" id="sel"></select>
<p>First name: <input data-bind="value: firstName" /></p>
<p>Last name: <input data-bind="value: lastName" /></p>
名字:待办事项

姓氏:待办事项

名字:

姓氏:

在项目的根目录中,我有index.html、knockout-3.4.0.js、require.js和text.js。我在“Models”子文件夹(rootDir\Models)中包含了cmp.js和cmp.html


最后一点需要注意的是,如果您大量使用knockout.js,那么只在全局范围(脚本标记)中加载knockout.js,而不将其用作每个javascript模块中的依赖项,可能会更容易一些。

事实上,我加载了两次knockout,这导致了问题。为了简化代码,我省略了重要的信息(脚本的声明),我会记住这一点,直到下一次。我正在大量使用knockout.js,所以我会按照您的建议将其加载到全局范围。
define(['knockout-3.4.0'], function (ko) {
    function MyComponentViewModel(params) {
        self = this;        
        self.firstName = ko.observable("John");
        self.lastName = ko.observable("Doe");
        self.sel = ko.observableArray(['France', 'Germany', 'Spain']);     
    }
    return {
        viewModel: MyComponentViewModel,
        template: { require: 'text!Models/cmp.html' }                
    };  
});
<p>First name: <strong data-bind="text: firstName">todo</strong></p>
<p>Last name: <strong data-bind="text: lastName">todo</strong></p>
<select data-bind="options: sel()" class="form-control" id="sel"></select>
<p>First name: <input data-bind="value: firstName" /></p>
<p>Last name: <input data-bind="value: lastName" /></p>