【发布时间】:2015-10-23 16:26:11
【问题描述】:
我正在开始第二次尝试使用 KO 创建应用程序,所以虽然我觉得我对库的理解还过得去,但我使用它的执行仍然需要工作。我有一个关于不只代表一个逻辑实体的视图的复杂模型的问题。
给定一个复杂的或复合的视图模型,其中主视图模型的属性是对象本身:
var mainViewModel = function(data){
var self=this;
self.user = new UserModel();
self.roles = new RolesCollectionModel();
}
function UserModel(data){
var self=this;
self.Name = ko.observable(data.name);
}
function RolesCollectionModel(data){
var self=this;
self.Items = ko.observableArray(data.items);
}
在我看来,KO 只识别第一级属性的绑定,没有“可观察到的冒泡”。因此,对于我来说要在子对象上使用数据绑定,看来我也必须将它们声明为可观察对象:
var correctViewModel = function(data){
var self=this;
self.SetUserModel= function(userData) {
this.user = ko.observable(userData);
}
self.SetRoles = function (data) {
this.roles = ko.observableArray(data);
}
}
如果我想绑定 userModel 属性的名称,相应地在我的 html 中:
<input data-bind:'textInput:userModel().name'/>
那么我的问题是:
我的结论是否正确,即不会发生“可观察冒泡”,这是实现与对象图中多个级别的属性绑定的唯一方法?
假设我在 1 中是正确的,上面的语法对我来说很奇怪。 userModel 和 name 都是 observables,但为了使我的示例正常工作,我必须将对象引用为 userModel().name。我本来希望绑定到 userModel.name。这里很混乱,对吧?
** 我已对其进行了编辑以包含我将使用的设置器。这个想法是顶级模型将在 >1 次调用 API 后组合/绑定。我这样做是因为它在 OO 意义上更自然,但从这次对话中可以看出,我可以在 API 响应之后显式设置对象属性,例如:
var topModel = new CorrectViewModel();
$.ajax({...}).done(function(data){
topModel.Users=(new UserModel(data));
})
我能问一下更惯用的风格是什么?
【问题讨论】:
-
主视图模型属性不需要是可观察的,不。 Here's a simplified example 以上内容。
-
谢谢詹姆斯,我看到你的作品符合我的预期。我的没有,例如我必须使用我在这里展示的语法,这就是我发布这个问题的原因。我会进一步深入研究。
-
我知道发生了什么。我无意中遗漏了一条关键信息。在我正在测试的模型中,我创建了 setter 方法,因为顶级模型不会一次全部实例化。子对象属性很可能会通过对 API 的单独调用来弹出:link
-
在这种情况下,是的,它们需要是可观察的,以便淘汰赛知道它们何时被填充
标签: knockout.js