0

わかりました。Knockout を使用すると、監視可能な配列の子要素のクリック バインディングを解析できないという問題があります。マッピングに問題があると思われますが、わかりません。私が作成したjsFiddleがあります:

http://jsfiddle.net/internetH3ro/ShjeE/1/

ここに私のJSがあります:

var PaycheckBudgetItem = function(data) {
    var self = this;
    self.PaycheckBudgetItemId = ko.observable(data.PaycheckBudgetItemId);
    self.PaycheckBudgetId = ko.observable(data.PaycheckBudgetId);
    self.Description = ko.observable(data.Description);
    self.Amount = ko.observable(data.Amount);
    self.DueDate = ko.observable(data.DueDate);
    self.IsPaid = ko.observable(data.IsPaid);
    self.PaidStatus = ko.observable(data.PaidStatus);

    self.updateStatus = function() {
        alert('test');
    };
};

var mapping = {
    'Items': {
        create: function(options) {
            return new PaycheckBudgetItem(options.data);
        }
    }
};

var PaycheckBudget = function(data) {
    var self = this;
    self.PaycheckBudgetId = ko.observable(data.PaycheckBudgetId);
    self.PaycheckBudgetDate = ko.observable(data.PaycheckBudgetDate);
    self.PaycheckBudgetAmount = ko.observable(data.PaycheckBudgetAmount);
    self.Remaining = ko.observable(data.Remaining);
    self.Items = ko.observableArray(data.Items);
    ko.mapping.fromJSON(data.Items, mapping, self.Items);
};

var BudgetListViewModel = function(data) {
    var self = this;
    self.budgets = ko.observableArray(data);
};

var data = [
    {
    "PaycheckBudgetId": 1,
    "PaycheckBudgetDate": "11/9/2012",
    "PaycheckBudgetAmount": 2315,
    "Items": [
        {
        "PaycheckBudgetItemId": 11,
        "PaycheckBudgetId": 1,
        "Description": "Rent",
        "Amount": 400,
        "DueDate": "11/9/2012",
        "IsPaid": "Unpaid",
        "PaidStatus": false},
    {
        "PaycheckBudgetItemId": 12,
        "PaycheckBudgetId": 1,
        "Description": "Cell Phone",
        "Amount": 166,
        "DueDate": "11/9/2012",
        "IsPaid": "Unpaid",
        "PaidStatus": false}
    ],
    "Remaining": 1749},
{
    "PaycheckBudgetId": 2,
    "PaycheckBudgetDate": "11/23/2012",
    "PaycheckBudgetAmount": 2315,
    "Items": [
        {
        "PaycheckBudgetItemId": 3,
        "PaycheckBudgetId": 2,
        "Description": "Rent",
        "Amount": 400,
        "DueDate": "11/23/2012",
        "IsPaid": "Unpaid",
        "PaidStatus": false},
    {
        "PaycheckBudgetItemId": 4,
        "PaycheckBudgetId": 2,
        "Description": "Tuition",
        "Amount": 250,
        "DueDate": "11/23/2012",
        "IsPaid": "Unpaid",
        "PaidStatus": false}
    ],
    "Remaining": 1665}
];

ko.applyBindings(new BudgetListViewModel(data), $('#budget-list-container')[0]);​

ここに私のHTMLがあります:

<div id="budget-list-container" class="well sidebar-nav">
        <ul class="nav nav-list" data-bind="template: { name: 'budgetTemplate', foreach: budgets, as: 'budget' }">
            <script type="text/html" id="budgetTemplate">
                <li class="nav-header">
                    Paycheck for <span data-bind="text: PaycheckBudgetDate"></span> - <span data-bind="text: formatCurrency(PaycheckBudgetAmount)"></span>
                </li>
                <li>
                    <table class="table table-bordered table-condensed">
                        <thead>
                            <tr>
                                <th>Description</th>
                                <th>Amount</th>
                                <th>Due Date</th>
                                <th>Paid/Unpaid</th>
                            </tr>
                        </thead>
                        <tbody data-bind="template: { name: 'budgetItemTemplate', foreach: Items, as: 'budgetItem' }"></tbody>
                    </table>
                        Remaining: <span data-bind="text: formatCurrency(Remaining)"></span>
                    <hr />
                </li>
            </script>
            <script type="text/html" id="budgetItemTemplate">
                <tr>
                    <td><span data-bind="text: Description"></span></td>
                    <td><span data-bind="text: formatCurrency(Amount)"></span></td>
                    <td><span data-bind="text: DueDate"></span></td>
                    <td>
                        <button class="btn-link pull-right update-status" data-bind="text: IsPaid, click: updateStatus" />
                    </td>
                </tr>
            </script>
        </ul>
    </div>​

その肉はこれです。PaycheckBudget と PaycheckBudgetItem の 2 つの KO モデルがあります。PaycheckBudget には、PaycheckBudgetItem モデルの監視可能な配列が含まれています。私のHTMLのクリックイベントにバインドされている「updateStatus」という名前のPaycheckBudgetItemモデルの関数があります。ページをロードすると、「バインディングを解析できません。updateStatus が定義されていません」というエラーが表示されます。

私の問題は、アイテムのマッピングのどこかにあると思います。クリック ハンドラーを削除すると、すべてが適切にバインドされて表示されます。

誰かが私を助けることができれば、私が欠けているものを指摘してくれるかもしれません. 私は Knockout に少し慣れていないので、明らかな/単純なものが欠けている可能性があります。

(いいえ、私のフィドルのデータはどれも機密でも実世界でもなく、単なるダミーデータです.:))

4

1 に答える 1

3

KnockoutJs JabbR チャット ルームであなたの質問に答えました。

あなたの仮定は正しいです。問題は主にマッピングにあるようです。PaycheckBudget クラスのコンストラクターを呼び出すことさえありません。たとえば、BudgetListViewModel コンストラクターは次のようになります。

var BudgetListViewModel = function(data) {
    var self = this;
    self.budgets = ko.observableArray(data);
};

しかし、おそらく次のようになるはずです:

var BudgetListViewModel = function(data) {
    var self = this;
    self.budgets = ko.observableArray(ko.utils.arrayMap(data, function(item){
        return new PaycheckBudget(item);
    }));
};

あなたの jsfiddle を少し編集して、http://jsfiddle.net/KBpET/に実際のサンプルを用意しました。最初に他のマッピングを編集したので、アイテムのマッピングが正しいかどうかを確認したことはありませんが、その手順を解決できると確信しています (リンクされたフィドルでアイテムのコードが変更されました)。

それが役に立てば幸い!

/ロバート

于 2012-11-13T17:27:28.457 に答える