1

次の KnockoutJS 2.0 コードは、最新のすべてのブラウザーで正常に動作しますが、IE8 では失敗します。

簡略化されたコードは次のとおりです。

<table>
   <tr>
       <td data-bind="template: { foreach: fooItems, name: 'foo-template' }></td>
       <td data-bind="template: { foreach: barItems, name: 'foo-template' }></td>
   </tr>
</table>

<script id="foo-template" type="text/html">
   <div data-bind="click: SomeMethod">
       foobar
   </div>
</script>

<script type="text/javascript">

   var viewModel = {
       fooItems: ko.observableArray(),
       barItems: ko.observableArray(),
   }
   ko.applyBindings(viewModel);

</script>

これは IE9、Chrome、Firefox で正常に動作します。

ただし、IE8 では、次のエラーが発生します。

「バインディングを解析できません。SomeMethod が定義されていません。」

これを IE8 でデバッグすると、次の情報が表示されます。

ここに画像の説明を入力

例外がスローされようとしており、foo-template のレンダリング中に発生しています。

$data が定義されていないことに注意してください。そのため、 SomeMethod は解決されていません。$data.SomeMethod に存在する必要がありますが、$data は定義されていません。

これが IE8 で失敗するのはなぜですか?

4

2 に答える 2

7

私はまったく同じ問題を抱えていましたが、方法を知らずに問題を解決したことに非常に失望しました.

したがって、将来の訪問者のために、これをどのように解決したかを次に示します。

foreach で使用される配列をハードコードされた配列で初期化し、最後にコンマを付けました。

あなたの例では、次のようになります。

viewModel.fooItems([
    {SomeMethod: function () {}},
    {SomeMethod: function () {}},   // <- here is the evil coma
]);

もう少し詳しく見てみると、ie8 はこの配列を、最後の項目が未定義の 3 つの項目の配列として評価しました。したがって、未定義の $data.

もちろん、症状が同じだからといって、問題が同じというわけではありませんが、誰かの役に立てば...

于 2013-01-07T20:50:59.623 に答える
1

私はIE8でjsfiddleであなたの例を試しましたが、問題ありません

http://jsfiddle.net/mFLDv/

于 2012-04-19T10:58:26.877 に答える