Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.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 剑道UI MVVM不清楚的行为_Javascript_Mvvm_Kendo Ui_Telerik_Observable - Fatal编程技术网

Javascript 剑道UI MVVM不清楚的行为

Javascript 剑道UI MVVM不清楚的行为,javascript,mvvm,kendo-ui,telerik,observable,Javascript,Mvvm,Kendo Ui,Telerik,Observable,有了下面的JavaScript代码,我想知道为什么在单击按钮时调用modify()函数时person.Name属性没有被更新 var person = { Id: 1, Name: "John" }; var model = kendo.observable({ start: function() { kendo.bind($("#test"), this); }, modify: function(){ var self = this; se

有了下面的JavaScript代码,我想知道为什么在单击按钮时调用modify()函数时person.Name属性没有被更新

var person = { 
  Id: 1, 
  Name: "John" 
};

var model = kendo.observable({
  start: function() {
    kendo.bind($("#test"), this);
  },
  modify: function(){
    var self = this;
    self.Name = "John Doe";
    console.log(self.Name);
    console.log(person.Name);
  }
});

var person = $.extend({}, person, model);
person.start();

这是因为您只更新“modify”函数范围中的self变量。您没有更新“person”变量。对jQuery扩展函数的调用没有将person对象绑定/关联到模型

使用对象类实现所需功能的示例如下所示:

var viewModel = kendo.observable({
  person: {
    id: 1,
    name: "John"
  },
  modify: function(e) {
    console.log(viewModel.person.get("name"));
    viewModel.person.set("name", "John Doe");
    console.log(viewModel.person.get("name"));
  }
});

kendo.bind($("#test"), viewModel);
一个工作的JSFIDLE是


需要注意的关键点是,person对象被定义为可观察对象的一部分,之后不会合并。另外,使用其“get”和“set”读取或更新可观察值也很重要。

感谢您回答我的问题。我共享的代码是我正在审阅的一个大得多的代码的简化版本。我理解你分享的例子,但我不确定它是否回答了我的问题。在我的代码中,当调用person.start()时,我的理解是“this”应该引用person对象。您可以通过在start方法中调用kendo.bind之前更新person.Id来验证这一点。没问题@Joe。前两句话说明了问题,但我会在这里补充更多细节。对$.extend的调用使用一个新对象作为第一个参数。因此,当您与它的person对象交互时,您不会与代码开头定义的person对象交互。我已经把你的代码片段分岔了,为了清晰起见,我添加了一些注释嘿@BenSmith,再次感谢你。您是说对$.extend的调用使用了一个新对象作为第一个参数,这是真的,但是我将这个对象重新分配给了person,所以它基本上与调用$.extend(person,model)相同。我想我发现了问题所在:在调用person.start()之前,person应该是一个可观察的对象。问题是,当$.extend将一个可观察对象(模型)与一个不可观察对象(人)组合在一起时,结果就是一个不可观察对象。这里有两种方法可以让它发挥作用:是的,你的重新分配是错误的。我在回答中说,“对jQuery扩展函数的调用没有将person对象绑定/关联到模型。”。当我说不绑定到person对象时,它意味着它不绑定到你的person对象,它是你的剑道可观察对象的一部分。。。