0

我不明白为什么顶部绑定不起作用,但是“with”语句确实起作用。

我已经在 J​​SFiddle here 上设置了问题

Why does this not appear when it is bound to Info.Title?
<div data-bind="text: Info.Title"></div>

<hr/>
But this does when I use the with statement?
<div data-bind="with: Info">
    <div>
         <h1 data-bind="text: Title"></h1>

    </div>
</div>
4

2 回答 2

1

第一个绑定绑定到observable的Title属性(未定义) 。Info当 ajax 调用完成时,Info对象被替换-Info.Title不再Info.Title是最初绑定的对象。

然而,在-scope 内,我相信当observable 发生变化with:时,该范围内的绑定会被重新评估,因此新的绑定会被正确地重新绑定。InfoTitle

要修改这一点,您不需要 replace Info,而是在 ajax 完成时更新其 observables。此外,Info它本身不需要是可观察的。这是一个带有建议的编辑小提琴:http: //jsfiddle.net/PQkJb/

于 2013-05-11T01:35:47.913 回答
1

问题是最初发生绑定时您的 Info 属性未定义。我更新为向您的 VM 添加一个方法,该方法检查是否填充了 Info,然后返回 Title。这是JSFiddle上的更新示例。更新后的绑定代码是这样的,调用VM函数:

<div data-bind="text: GetTitle()"></div>

更新后的 VM 如下所示,注意最后添加的功能:

function DareDetailViewModel() {
    var self = this;
    self.Info = ko.observable();

    var flickerAPI = "http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?";
    $.getJSON(flickerAPI, {
        format: "json"
    })
    .done(function (data) 
    {
        self.Info(new MapInfo(data));
        console.log(data);
    });

    self.GetTitle = function() {
        if(self.Info())
            return self.Info().Title();
    };
};

另一种选择是使用也具有初始标题的对象来初始化 Info 属性。但这似乎是更长的方法,所以我没有。:)

于 2013-05-11T01:57:57.670 回答