0

我有一个带有以下淘汰赛绑定(可见)的 HTML div:

<div class="row"  data-bind="visible: HotelMasterRow">
    <div class="col col-lg-4">
        <div class="panel">
            <div class="panel-heading">
                <span class="glyphicon glyphicon-edit pull-right"></span> Hotel Master
            </div>
        </div>
    </div>
</div>

在页面加载时,可见绑定设置为 false。我试图在 Ajax 成功事件上切换可见绑定。以下是我发起 Ajax 请求的点击绑定:

<button class="btn btn-success disabled" type="submit" data-bind="css: enablebtn, click: SearchHotel">Search</button>

实现相同的 JavaScript 代码是:

this.SearchHotel = function(){
            $.ajax({
                url:"../api/hotel_master_search.php",
                type:"get",
                data:{hotel: this.hotelName},
                cache: false,
                success:function(hotel_data){
                    var hotel_data = $.parseJSON(hotel_data);
                    this.HotelId = ko.observable(hotel_data[0].hotel_id);
                    this.SearchHotelName =  ko.observable(hotel_data[0].hotel_name);
                    this.HotelEN = ko.observable(hotel_data[0].hotelEN);
                    this.HotelCode = ko.observable(hotel_data[0].hotelcode);

                    this.HotelMasterRow(true);
                }
            });
        }

即使 Ajax 响应确实返回了正确的数据,this.HotelMasterRow(true); 似乎没有工作。div 仍然不可见。任何想法为什么?

4

2 回答 2

3

“this”在成功回调的范围内并不引用您的模型。你想要做的是在你的模型中声明一个引用“this”的变量,并在你的成功回调中调用这个变量。像这样的东西:

var Model = function() {
    var self = this;

    this.SearchHotel = function() {
        $.ajax({
            ...
          success: function(data) {
            ...
            self.HotelMasterRow(true);
            ...
          }
        }
    }

}
于 2013-08-03T13:13:21.967 回答
1

所以另一个答案是绝对正确的,但我觉得你显示的代码存在一个关键缺陷,除了 HotelMasterRow 的 this 与 self 的上下文之外 -

您的数据集将是 Knockout Observables,但我不知道您打算如何绑定到它们。由于它们嵌套在 SearchHotel 函数中,并且可能在您的视图模型中而不是模型中,因此您要么必须拥有一家酒店才能搜索它,要么您需要分离模型和视图模型逻辑并创建一个可观察的数组来存储您的数据。如果一次只返回一个对象,那么您显然可以使用 Observable 代替。

这做了很多事情 - 它允许您不必专门绑定您的可见绑定到 HotelMasterRow (除非有数据,否则不会显示任何数据)或者如果您想继续这样做,它将允许您分离您的关注点和拥有良好的可重复 JavaScript -

在你的 JavaScript 页面中创建一个模型(或者任何你想要的,只要它是可访问的)

function HotelModel(id, name, en, code) {
    var self = this;        
    self.HotelId = ko.observable(id);
    self.SearchHotelName =  ko.observable(name);
    self.HotelEN = ko.observable(en);
    self.HotelCode = ko.observable(code);
}

然后在您的 Ajax 调用成功时创建一个 HotelModel 类型的可观察对象并将其推送到 ObservableArray

self.Hotels = ko.observableArray();
self.SearchHotel = function(){
     $.ajax({
        url:"../api/hotel_master_search.php",
        type:"get",
        data:{hotel: this.hotelName},
        cache: false,
        success:function(hotel_data){
            var hdata = $.parseJSON(hdata);
            self.Hotels.push(new HotelModel(hdata[0].hotel_id, hdata[0].hotel_name, hdata[0].hotelEN, hdata[0].hotelcode));       
            self.HotelMasterRow(true);
        }
    });
}; 

http://jsfiddle.net/G5KAU/

于 2013-08-03T14:49:51.977 回答