Javascript JQuery敲除ComputedObservable写入未被调用ObservableArray

Javascript JQuery敲除ComputedObservable写入未被调用ObservableArray,javascript,jquery,knockout.js,ko.observablearray,computed-observable,Javascript,Jquery,Knockout.js,Ko.observablearray,Computed Observable,我试图绑定一个内部使用可观察数组的计算可观察对象。 加载时确实会调用“read”方法。 但是,当表中的值更改并且焦点移动时,不会调用“write”方法。 请注意,对于简单的计算可观测值,“write”方法可以工作,它不包装数组,而是包装一个简单的字符串。但是,对于这种情况,它不起作用。 我查看了敲除api文档和在线论坛,但找不到任何关于此的内容。有人能给点建议吗? 下面是HTML代码 <thead> <tr><th>People

我试图绑定一个内部使用可观察数组的计算可观察对象。 加载时确实会调用“read”方法。 但是,当表中的值更改并且焦点移动时,不会调用“write”方法。 请注意,对于简单的计算可观测值,“write”方法可以工作,它不包装数组,而是包装一个简单的字符串。但是,对于这种情况,它不起作用。 我查看了敲除api文档和在线论坛,但找不到任何关于此的内容。有人能给点建议吗? 下面是HTML代码

        <thead>
        <tr><th>People Upper Case Name</th></tr>
        </thead>
        <tbody data-bind="foreach: uppercasepeople">
        <tr>
           <td ><input type="text" data-bind="value: name"/></td>            
        </tr>
        </tbody>
        </table>

人名大写
下面是Java脚本代码

    <script type="text/javascript">


var MyViewModel = function () {

    var self = this;
    var self = this;

    //Original observable array is in lower case
    self.lowercasepeople = ko.observableArray([
    { name: "bert" },
    { name: "charles" },
    { name: "denise" }
]);

    //coputed array is upper case which is data-bound to the ui
    this.uppercasepeople = ko.computed({
        read: function () {
            alert('read does get called :)...yaaaa!!!');
            return self.lowercasepeople().map(function (element) {
                var o = { name: element.name.toUpperCase() };
                return o;
            });
        },
        write: function (value) {
            alert('Write does not get called :(... why?????');
            //do something with the value
            self.lowercasepeople(value.map(function (element) { return element.toLowerCase(); }));
        },
        owner: self
    });


}

ko.applyBindings(new MyViewModel());

var MyViewModel=函数(){
var self=这个;
var self=这个;
//原始可观测阵列为小写
self.lowercasepeople=ko.observableArray([
{name:“bert”},
{姓名:“查尔斯”},
{姓名:“丹尼斯”}
]);
//coputed数组是大写的,它是绑定到ui的数据
this.uppercasepeople=ko.computed({
读:函数(){
警报('read确实被调用:)…yaaaa!!!');
返回self.lowercasepeople().map(函数(元素){
var o={name:element.name.toUpperCase()};
返回o;
});
},
写入:函数(值){
警报('写入未被调用:(…为什么?);
//做一些有价值的事情
self.lowercasepeople(value.map(函数(元素){return element.toLowerCase();}));
},
所有者:self
});
}
应用绑定(新的MyViewModel());


我把代码放在了类似于Knockout API文档中所示的示例的地方,这样人们就可以很容易地联系起来。

您所拥有的计算可观测值只处理数组本身。只有当您试图直接设置
uppercasepeople
的值时,
write
函数才会被调用

在这种情况下,您可能希望在person对象本身上使用一个可写的计算机,并使名称可见。然后,可写计算将名称转换为大写,写入时将用小写值填充可观察的名称。

var MyViewModel = function () {

var self = this;

//Original observable array is in lower case
self.lowercasepeople = ko.observableArray([
{ name: "bert" },
{ name: "charles" },
{ name: "denise" }
]);

self.recententlyChangedValue = ko.observable();

//coputed array is upper case which is data-bound to the ui
this.uppercasepeople = ko.computed({
    read: function () {
        alert('read does get called :)...yaaaa!!!');
        return self.lowercasepeople().map(function (element) {
            var o = { name: element.name.toUpperCase() };
            return o;
        });
    },
    write: function (value) {
        alert('It will be called only when you change the value of uppercasepeople field');
        //do something with the value 

         self.recententlyChangedValue(value);             
    },
    owner: self
});
}

谢谢@RP Niemeyer。但是,需要为数组创建绑定,因为在我的示例中,它将在运行时填充。此数组绑定到一个表。如果我在person对象上使用writeable computed,我将如何将数组链接到person对象。我不太清楚你的答案。你能举个例子吗?再次感谢您的快速响应。它将是这样的:您将每个人从服务器映射到一个对象,该对象具有可观察的和可计算的。就是这样。非常感谢!