淘汰赛JS Ajax调用不填充观察到阵列(Knockout JS Ajax call not pop

2019-07-17 20:49发布

下面的例子示出了从使用JSON,然后可以过滤的结果为根据的“type” 2所列出被填充可观察到的阵列。

直到我试图从一个Ajax调用加载完全相同的Json这一切工作正常!

奇怪的是,如果我在脚本中显示提醒信息,然后它工作正常...

http://jsfiddle.net/spdKE/3/

<h2>Brand</h2>
<ul id="list-dimensions" data-bind="foreach: filteredDimensions('BRAND')">
    <li>
        <div class="item">ID</div> <span data-bind="text: $data.id"</span>
    </li>
</ul>
<h2>Area</h2>
<ul id="list-dimensions" data-bind="foreach: filteredDimensions('AREA')">
    <li>
        <div class="item">ID</div> <span data-bind="text: $data.id"</span>
    </li>
</ul>​

function ProductDimensionsViewModel () {
        var self = this;
        self.dimensions = ko.observableArray();

        var baseUri = 'api/product_dimensions.php';


        /*$.getJSON(baseUri, function(data){
            success: self.dimensions = data;
        });*/

        $.ajax({
            type: 'GET',
            url: baseUri,
            data: {},
            context: this,
            success: function(data) {
                self.dimensions = data
            },
            dataType: 'json'
        });


        self.filteredDimensions = function(type) {
        return $.map(self.dimensions, function(dimension) {
                if (dimension.type == type) {
                    return dimension;
                }
            });
        }

    }





        ko.applyBindings(new ProductDimensionsViewModel());

Answer 1:

要替换的变量,而不是更新它:

...
success: function(data) {
  self.dimensions = data
},
...

观测更新是这样的:

...
success: function(data) {
  self.dimensions(data)
},
...

我不会用filteredDimensions('AREA')因为这被只要你的页面渲染调用。 使用可观测量,存储在变量currentFilter的值,然后通过模板加载正确的视图。 另外,如果你只有两个过滤器,更好的方法是仅仅有两种方法: filterByAreafilterByBrand

编辑 :添加例子: http://jsfiddle.net/jjperezaguinaga/spdKE/4/



文章来源: Knockout JS Ajax call not populating observable array