0

私は PagerJS プラグインを使用して KnockoutJS に取り組んでおり、この問題が見つかりました。それがPagerJSに関係しているかどうかはわかりませんが、ここに問題があります。

pagepager.js とsourceOnShowプロパティのバインディングを使用します。ソース コンテンツ内に、親の ViewModel の監視可能なプロパティにバインドされた子ページがあります。

監視可能なプロパティが変更されると、子は新しいデータを更新しようとしました。しかし、最初の値がバインドされた後、動作が停止したようです。各ステップの間にいくつかのログを挿入すると、結果は次のようになります。

サンプル コードの結果には のみが表示さjob_idれ、残りは空のバインドを持つブロックが表示され、コンソールにはlog1とのみが記録されますlog2。その他のエラーは記録されていません。最初のバインディングの後に機能しなくなったかのように。

私のコードは、例えば

main page

<script src="/js/jobspage.js"></script>
<!-- some elements -->
<div data-bind="page: {
    id: 'somepage',
    title: 'Some Page',
    sourceOnShow: 'template/somepage',
    role: 'start'
}"></div>
<div data-bind="page: {
    id: 'jobs',
    title: 'Jobs',
    sourceOnShow: 'template/jobs',
    with: JobsPageVM
}"></div>
<div data-bind="page: {
    id: 'other',
    title: 'Other Page',
    sourceOnShow: 'template/otherpage'
}"></div>

/template/jobs

<div class="jobs" id="main" role="main">
    <div class="job-list" data-bind="page: {role: 'start'}">
        <!-- ko foreach: jobitems -->
        <div data-bind="event: {click: item_clicked}">
            <!-- item description -->
            <!-- item_clicked will set the selectedItem (observable) property of JobsPageVM -->
        </div>
        <!-- /ko -->
    </div>
    <div class="job-info" data-bind="page: {id: 'jobinfo', with: selectedItem}">
        <!--ko text: console.log('log1')--><!--/ko-->
        <!-- some elements -->
        <!--ko text: console.log('log2')--><!--/ko-->
        Job ID : <span class="job-value" data-bind="text: job_id"></span>
        <!--ko text: console.log('log3')--><!--/ko-->
        Job Title : <span class="job-value" data-bind="text: job_title"></span>
        <!--ko text: console.log('log4')--><!--/ko-->
    </div>
</div>

jobspage.js

var JobsPageVM = function () {
    var self = this;
    var dataitems = ko.observableArray();

    self.isLoading = ko.observable(true);
    self.searchTerm = ko.observable("");
    self.jobitems = ko.computed(function () {
        var search_input = self.searchTerm().toLowerCase();
        if (search_input === "") {
            return dataitems();
        } else {
            return ko.utils.arrayFilter(dataitems(), function (item) {
                var data = item.cust_first_name + item.cust_last_name;
                return data.search(new RegExp(search_input, "i")) >= 0;
            });
        }
    }, this);

    self.selectedItem = ko.observable();
    self.branchID = ko.observable(sample_branch_id);

    self.getJobList = function (status) {
        self.isLoading(true);
        if (typeof (status) === "undefined") {
            status = "all";
        }

        $.ajax({
            url: "/api/job/branch/" + self.branchID(),
            data: {
                jobstatus: status
            },
            success: function (data) {
                dataitems(data); // data is an array of object items contains `job_id`, `job_title`, and more
                self.isLoading(false);
            },
            error: function (x, s, e) {
                console.log(x, s, e);
                self.isLoading(false);
            }
        });
    };

    self.item_clicked = function (vm, e) {
        self.selectedItem(vm);
        pager.navigate('jobs/jobinfo');
    };

    self.getJobList();
};

※ルール違反かどうかはわかりません。この質問は以前に尋ねられましたが、回答がなかったので、ここで削除して再質問しました。@Stijn と @KristianNissen に感謝します。質問を絞り込むのに役立ちます。

4

1 に答える 1

0

一種の回避策、またはおそらく解決策を見つけました。しかし、問題の原因はよくわかりませんでした。

もともと、上記の問題を引き起こしたバインディングにselectedItemをバインドしようとしました。page: {with: ...}ここで、バインディングselectedItemの内側ではなく、要素自体とのバインディングを変更しましたpage:

私はこれから変更しました:

<div class="job-info" data-bind="page: {id: 'jobinfo', with: selectedItem}">

これに:

<div class="job-info" data-bind="page: {id: 'jobinfo'}, with: selectedItem">

そして、今はうまくいっているようです。

于 2014-10-14T07:53:20.457 に答える