【问题标题】:KnockoutJS get property valueKnockoutJS 获取属性值
【发布时间】:2012-12-30 04:52:16
【问题描述】:

我有一个非常简单的问题,但不明白我错过了什么。 代码如下:

$(document).ready(function() {
var viewModel = {
    test: ko.observable(null)
}
var obj = {
    name: "name123"
}
viewModel.test(obj);    
ko.applyBindings(viewModel.test, document.getElementById("a"));
alert(viewModel.test.name());
});​

链接到 jsfiddle:http://jsfiddle.net/bwkAB/ 为什么我无法获取 name 属性值?

更新: 它应该是 viewModel.test().name

【问题讨论】:

  • 小提琴似乎工作得很好,或者......?
  • 警报对我不起作用。在 mozilla 中它说:“TypeError:viewModel.test.name 不是函数”
  • @WernerVesterås 警报不起作用,因为 user1025981 没有使子对象的属性可观察,而是将成员“名称”作为方法调用,就好像它是可观察的一样

标签: knockout.js


【解决方案1】:

这里是更正的jsfiddle,您需要使子对象属性可观察才能绑定到它。以及添加 with 绑定以帮助 HTML 中的范围

$(document).ready(function() {
    var viewModel = {
        test: ko.observable(null)
    }
    var obj = {
        name: ko.observable("name123")
    }
    viewModel.test(obj);    
    ko.applyBindings(viewModel);
    alert(viewModel.test().name());
});​

【讨论】:

  • 没有括号的名称按预期工作。谢谢。
  • @user1025981 请检查新的 jsfiddle 以获得如何简化信息的一个很好的例子,去掉括号并将属性保留为静态而不是可观察的是一种选择,但我认为你会更喜欢新的例如,还要注意 HTML 'with:' 绑定
  • 我明白了,但情况如下:我发出ajax请求并得到一个对象数组。我用这个数组在移动应用程序中创建了一个列表视图。我为列表项连接了一个单击事件,当单击一个列表项时,我将其保存在一个对象中 - selectedItem 并转换到详细信息视图页面。然后我绑定这个选定项目的详细信息页面。但是所选项目的属性是不可观察的,因为它们来自请求。我可以为这些属性做些什么吗?
  • 我认为我应该使用 ko.mapping,我完全错过了框架的概念。
  • @user1025981 这当然是一个选项,但是做一些基准测试,你会发现使用敲除最慢的部分是使用映射的地方。它确实为您节省了几行代码,但与用户体验相比,这几行代码是什么。只是一点友好的建议。
猜你喜欢
  • 2019-02-19
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 2017-02-14
  • 2016-09-19
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多