javascript - 绑定(bind) observable 的子属性时未获取 View 中的所有值

标签 javascript mvvm knockout.js

在我的 knockout 绑定(bind) View 中,我没有获得所有值。

这是我的脚本文件:

var ViewModel = function () {
    var self = this;
    self.games = ko.observableArray();
    self.error = ko.observable();
    self.detail = ko.observable();

    var gamesUri = '/api/games/';

    self.getGameDetail = function (item) {
        ajaxHelper(gamesUri + item.Id, 'GET').done(function (data) {
            self.detail(data);
        });
        console.log(self.detail);
    };
    function ajaxHelper(uri, method, data) {
        self.error('');
        return $.ajax({
            type: method,
            url: uri,
            dataType: 'json',
            contentType: 'application/json',
            data: data ? JSON.stringify(data) : null
        }).fail(function (jqXHR, textStatus, errorThrown) {
            self.error(errorThrown);
        });
    }

    function getAllGames() {
        ajaxHelper(gamesUri, 'GET').done(function (data) {
            self.games(data);
        });
    }

    getAllGames();
};

ko.applyBindings(new ViewModel());

这是我的观点:

<div class="row">
    <div class="col-md-4">
    <div class="panel panel-default">
        <div class="panel-heading">
            <h2 class="panel-title">Games</h2>
        </div>
        <div class="panel-body">
            <ul class="list-unstyled" data-bind="foreach: games">
                <li>
                    <strong><span data-bind="text: DeveloperName"></span>:<span data-bind="text: Title"></span></strong>
                    <small><a href="#" data-bind="click: $parent.getGameDetail">Details</a></small>
                </li>
            </ul>
        </div>
    </div>
        <div class="alert alert-danger" data-bind="visible: error"><p data-bind="text: error"></p></div>
    </div>

    <div class="col-md-4">
       <div class="panel panel-default">
           <div class="panel-heading"><h2 class="panel-title">Details</h2></div>
       </div>
        <table class="table">
            <tr><td>Developer</td><td data-bind="text: detail().DeveloperName"></td></tr> //Only this value is displayed
            <tr><td>Title</td><td data-bind="text: detail().Title"></td></tr>
            <tr><td>Price</td><td data-bind="text: detail().Price"></td></tr>
            <tr><td>Genre</td><td data-bind="text: detail().Genre"></td></tr>
            <tr><td>Year</td><td data-bind="text: detail().Year"></td></tr>
        </table>
    </div>

    <div class="col-md-4">

    </div>
</div>

问题是它只在 View 中显示DeveloperNameTitlePriceGenreYear 不会显示在 View 中。我尝试了很多方法,但我不知道错误在哪里。

最佳答案

有两种方法。

最简单的方法是使用 withtemplate 绑定(bind)。技术类似,但我将展示一个使用 with 绑定(bind)的示例:

<table class="table" data-bind="with: details">
   <tr><td>Developer</td><td data-bind="text: DeveloperName"></td></tr>
   <tr><td>Title</td><td data-bind="text: Title"></td></tr>
   <tr><td>Price</td><td data-bind="text: Price"></td></tr>
   <tr><td>Genre</td><td data-bind="text: Genre"></td></tr>
   <tr><td>Year</td><td data-bind="text: Year"></td></tr>
</table>

使用这种技术,每当您更改 details 可观察对象内的对象时,新值都会应用于具有 with 绑定(bind)的 elment 内的子元素。在本例中,table 元素内的所有元素。此外,语法更短、更清晰。 注意:如果您需要绑定(bind)对象绑定(bind)之外的内容,则必须可以使用 $parent$parents[]$root

最难的一个,只有当您的 View 模型更复杂并且具有例如计算的可观察值时才需要,您需要创建一个其属性也是可观察值的对象。在这种情况下,您绑定(bind)该对象一次,并且在接下来的情况下,您更新 innser 可观察的属性,而不是更改对象本身。

对于您的示例,您必须创建一个具有所有属性的对象,例如 DeveloperNameTitlePrice 等,定义为可观察到的。然后,您必须将 AJAX 恢复的值映射到此属性,您可以手动执行此操作,执行 details().DeveloperName(newDetails.DeveloperName) 等,或使用 ko.mapping插件。

重要提示:如果您使用此技术,则必须保留原始 details 绑定(bind)对象,并更新其属性。如果您用新对象替换 details 对象本身,绑定(bind)将会丢失,并且将停止按需要工作。

另一个注意事项:你不能按照你的想法使用 cleanNodes。请参阅this Q&A .

关于javascript - 绑定(bind) observable 的子属性时未获取 View 中的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33477624/

相关文章:

javascript - Angular Ui 树递增是重复的

c# - 仅在选择选项卡时运行查询 WPF MVVM

wpf - 如何以编程方式将选项卡项添加到 prism 中的选项卡控件

javascript - 显示摘要行时 Syncfusion ejGrid 和 knockout.js 出现问题

javascript - 忽略服务 worker 请求中的查询参数

javascript - 如何检查数组中是否存在某个值并获取下一个值?

javascript - 单击时切换 DIV 的可见性

java - Android MVVM RecyclerView ClickListener Kotlin 到 Java 转换

javascript - 在 Knockout 中使用下拉列表进行内联编辑

javascript - Knockout.js:If 和 foreach 绑定(bind),检查可观察数组上的真值