【问题标题】:Knockout observableArray push not working淘汰 observableArray 推送不起作用
【发布时间】:2014-08-20 21:41:47
【问题描述】:

我有以下标记:

<table>
   <tr>
     <td style="padding-left: 150px;">
        <ul id="items" data-bind='foreach: Items'>
           <li>
              <span class="title" data-bind="text: $data.Title"></span>
            <li>  
      </td>
  </tr>
</table>

还有下面的javascript:

$(function () { 
  var ViewModel = function () {
        var self = this;
        self.Items= ko.observableArray();

        self.arrayChanged = function (array) {
            $.each(array, function (i, obj) {
                self.Items.push(obj);
            });
        };
    };
    var viewModel = new ViewModel();
    ko.applyBindings(viewModel, $("#items")[0]);
    viewModel.arrayChanged($.parseJSON('@Html.Raw(Json.Encode(Model.Items))'));               
});

以上是我正在尝试做的一个非常简化的版本。在上面

self.Items.push(obj);

不起作用,因为它无法在 Items observableArray 上推送新项目。我也尝试过使用

ko.utils.arrayPushAll(self.Experiences, obj);

无济于事。有什么想法吗?

【问题讨论】:

  • Model.Items 的 JSON 是什么样的?
  • 更具体地说 - 你确定这个 $.parseJSON('@Html.Raw(Json.Encode(Model.Items))') 是数组吗?
  • 在紧急情况下使用 self.Items.valueHasMutated()
  • 是的,Ilya,$.parseJSON('@Html.Raw(Json.Encode(Model.Items))') 生成一个数组。
  • 约翰,我之前尝试过使用 self.Items.valueHasMutated() 并没有帮助。

标签: jquery knockout.js knockout-2.0


【解决方案1】:

试试这个

self.arrayChanged = function (array) {
    var arr = JSON.parse(array)    
    self.Items(arr)
};

将 json 转换为对象,然后将对象数组传递给 Items

【讨论】:

  • 是的,将每个对象推入数组并不是很好,因为它会触发与输入中的项目一样多的依赖解决方案。这个答案一次将所有输入分配给数组。
  • Raheel,我已经使用 $.parseJSON('@Html.Raw(Json.Encode(Model.Items))') 传入了数组。我尝试通过使用'@Html.Raw(Json.Encode(Model.Items))' 传递 Json 字符串然后使用 self.Items(arr) 来使用您的建议,但它仍然不起作用。
  • 其实,没关系,这个建议在玩了一点之后确实奏效了。所以,非常感谢。
猜你喜欢
  • 2012-08-22
  • 2016-08-21
  • 2017-06-09
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
相关资源
最近更新 更多