Javascript 在Knockout.js中正确处理模板和视图的方法

Javascript 在Knockout.js中正确处理模板和视图的方法,javascript,mvvm,knockout.js,Javascript,Mvvm,Knockout.js,我有以下看法: 你的细节 {{if loggedIn}} 这就是你一直在告诉我们的: 名称 ${name} 性别 ${性别} 年龄 ${age} 国家 ${country} {{else} 嘿,你这个大男人!过来 给我们你所有的个人信息 数据!我们保证不会给它 对任何人都是免费的 {{/if} 你的帐户 有2条来自雅虎,1条来自Lumosity,5条来自Tweetland 雅虎 电子邮件 blabisbla@yahoo.com 动动脑 用户名 伊洛维特补充道 推特土地 用户名

我有以下看法:

你的细节 {{if loggedIn}} 这就是你一直在告诉我们的:

名称 ${name} 性别 ${性别} 年龄 ${age} 国家 ${country} {{else} 嘿,你这个大男人!过来 给我们你所有的个人信息 数据!我们保证不会给它 对任何人都是免费的

{{/if} 你的帐户 有2条来自雅虎,1条来自Lumosity,5条来自Tweetland

  • 雅虎 电子邮件 blabisbla@yahoo.com
  • 动动脑 用户名 伊洛维特补充道
  • 推特土地 用户名 肋动脉造影剂 游戏 洛夫城,卡拉斯,单位
该代码:

(function($) {

    var userDetails = {
        "name": "Óscar Acuña",
        "country": "Costa Rica",
        "province": "San José",
        "district": "San Andrés",
        "zip": "123456",
        "birthday": "12/12/1990",
        "gender": "Male",
        "hotnessIndex": "6.8",
        "smell": "Nice if not sweaty"
    };


    // Overall viewmodel for this screen, along with initial state
    var viewModel = {
        loggedIn : "yeah",
        name: userDetails.name,
        country: userDetails.country,
        province: userDetails.province,
        gender: userDetails.gender,
        age: getAgeSortOf(userDetails.birthday) + " years old"
    };

    ko.applyBindings(viewModel);

    function getAgeSortOf(birthday) {
        return new Date().getFullYear() - new Date(birthday).getFullYear();

    }

})(jQuery);
请注意,我为第一个li详细阐述了模板

让我们想象一下,可能有多达10个
li
s,每个都包含不同的数据(因此不太可能想到它们共享一个视图)。数据来自供应商,因此他们可以在认为合适时更改名称和订单

您可以看到一个模板存储了它可能具有的不同状态。我的问题是,你认为这是一种安全的方法吗?毕竟,真正的数据是由Ajax请求提供的(这里由硬编码的JSON userDetails表示)


另外,设置决定流量的变量最灵活的方法是什么?(例如loggedIn:“yeah”,如果删除它,将显示另一个视图)。在这里,我在viewModel中对它们进行编码,但实际上它们可以在外部进行编码。。。这是正确的方法还是我误用了击倒?我从来没有在前端处理过MVVM框架,所以我可能有点困惑。

看起来您想使用
ko.observearray()
保存用户详细信息。如果我理解正确的话,您需要多个
li
元素,每个
UserDetails
元素对应一个从ajax调用返回的元素。您的视图模型如下所示:

viewModel = {
  loggedIn: ko.observable(true),
  users: ko.observableArray([])
} 
然后通过调用
viewModel.users.push(newUser)

用于枚举用户的模板:

<ul data-bind="template:{name:'userTmpl', foreach:users}"></ul>

    Oscar-你能把你的问题归结为它的本质吗?你想知道什么?当然可以。基本上问题是。。。如果我有两个或两个以上的状态是由全局变量(用户的计算机品牌、是否登录等)决定的,我应该在哪里设置该变量,以便knockout呈现正确的数据?谢谢!这就是我想要的解释!