【问题标题】:knockout containerless foreach not working淘汰无容器 foreach 不工作
【发布时间】:2018-03-01 06:14:16
【问题描述】:

我一定遗漏了什么,所以请告诉我。
我正在使用Knockout 3.4.2

我所有的其他绑定都在工作,但 foreach 只是没有运行。我错过了什么吗?

我的 PageViewModel:

export class UserManagementViewModel implements IPageViewModel {
        userApi: AjAxConnection<any>;
        listOfUsers: KnockoutObservableArray<IUser>;
        isLoading: KnockoutObservable<boolean>;
        currentPage: KnockoutObservable<number>;
        totalPages: KnockoutObservable<number>;
        totalCount: KnockoutObservable<number>;
        totalRecordsPerPage: KnockoutObservable<number>;

        // New User
        newUserEmail: KnockoutObservable<string>;
        newUserFirstName: KnockoutObservable<string>;
        newUserLastName: KnockoutObservable<string>;
        newUserValidation: KnockoutValidationGroup;

        constructor() {
            this.userApi = new AjAxConnection("api/user");
            this.listOfUsers = ko.observableArray([]);
            this.isLoading = ko.observable(false);
            this.currentPage = ko.observable(0);
            this.totalPages = ko.observable(0);
            this.totalCount = ko.observable(0);
            this.totalRecordsPerPage = ko.observable(10);

            this.newUserEmail = ko.observable("").extend({
                required: {message: "Email Address is required."}
            });
            this.newUserFirstName = ko.observable("").extend({
                required: {message: "First Name is required."}
            });
            this.newUserLastName = ko.observable("").extend({
                required: {message: "Last Name is required."}
            });

            this.newUserValidation = ko.validatedObservable({
                email: this.newUserEmail(),
                firstName: this.newUserFirstName(),
                lastName: this.newUserLastName()
            });

        }

        init(): void {
            this.updateUserList();
        }

        updateUserList(): void {
            this.isLoading(true);
            this.userApi.get("?page=" + this.currentPage() + "&totalPerPage=" + this.totalRecordsPerPage(),
                    ContentTypes.json)
                .done((data: IPagableResourceModel<IUser>) => {
                    console.log(data);
                    if (data.isSuccessful) {
                        this.listOfUsers().push(data.results);
                    } else {

                    }
                }).always(() => {
                    this.isLoading(false);
                });
        }

        openNewUserModal(): void {
            $("#newUserModal").modal("show");
        }

        cancelNewUserModal(): void {
            this.closeNewUserModal();
            this.clearNewUserDetails();
        }

        createNewUser(): void {
            if (this.newUserValidation.isValid()) {
                this.userApi.post("",
                    {
                        "firstName": this.newUserFirstName(),
                        "lastName": this.newUserLastName(),
                        "userName": this.newUserEmail()
                    },
                    ContentTypes.json);
            }
        }

        private closeNewUserModal(): void {
            $("#newUserModal").modal("hide");
        }

        private clearNewUserDetails(): void {
            this.newUserEmail("");
            this.newUserFirstName("");
            this.newUserLastName("");
        }
    }

IUser 是基本的:

export interface IUser {
    id: string;
    firstName: string;
    lastName: string;
    userName: string;
}

最后是我的观点:

<div id="Users" class="tab-pane active">
    <h3>Users</h3>
    <div class="container">
        <div class="row">
            <div class="col-md-2">Id</div>
            <div class="col-md-2">UserName</div>
            <div class="col-md-2">FullName</div>
            <div class="col-md-2">Organization</div>
            <div class="col-md-2">Clinic</div>
            <div class="col-md-2">Options</div>
        </div>
        <div class="row" data-bind="visible: isLoading()">
            <div class="col-md-12 text-center">
                <img src="~/images/loading.gif" alt="Loading" />
                <br />
                Please wait, loading...
            </div>
        </div>
        <div class="row" data-bind="visible: !isLoading() && listOfUsers().length == 0">
            <div class="col-md-12 text-center">
                No Users Found.
            </div>
        </div>
        <div data-bind="visible: !isLoading() && listOfUsers().length != 0">
            <!--ko foreach: listOfUsers-->
            <div class="row">
                <div class="col-md-2"><!--ko text: id--><!--/ko--></div>
                <div class="col-md-2"><!--ko text: userName--><!--/ko--></div>
                <div class="col-md-2"></div>
                <div class="col-md-2"></div>
                <div class="col-md-2"></div>
                <div class="col-md-2">[OPTIONS GO HERE]</div>
            </div>
            <!--/ko-->
        </div>
    </div>
</div>

呈现的 HTML 和淘汰赛上下文:

显示 API 调用的控制台:

【问题讨论】:

  • 您在控制台中看到任何错误吗?
  • 我没有看到任何语法问题。你能发布一个工作的 sn-p 或小提琴吗?
  • @NisargShah 好吧,至少我知道我当时没疯。
  • 这里加断点测试了吗? if (data.isSuccessful) { this.listOfUsers().push(data.results); }。数据是否被推送?还有init()方法是怎么调用的?
  • 我有一个console.log(data),数据来自API。我可以在 ViewModel 中看到 listOfUsers(使用 Chrome 的 Knockout Context 扩展),并且该数组有数据。

标签: javascript jquery typescript knockout.js


【解决方案1】:

我终于发现了我的错误,它虽然很小,但同时也很大。

在我的 PageViewModel 中有这个之前:

    updateUserList(): void {
        this.isLoading(true);
        this.userApi.get("?page=" + this.currentPage() + "&totalPerPage=" + this.totalRecordsPerPage(),
                ContentTypes.json)
            .done((data: IPagableResourceModel<IUser>) => {
                console.log(data);
                if (data.isSuccessful) {
                    this.listOfUsers().push(data.results);
                } else {

                }
            }).always(() => {
                this.isLoading(false);
            });
    }

我不得不把它改成这样:

    updateUserList(): void {
        this.isLoading(true);
        this.userApi.get("?page=" + this.currentPage() + "&totalPerPage=" + this.totalRecordsPerPage(),
                ContentTypes.json)
            .done((data: IPagableResourceModel<IUser[]>) => {
                console.log(data);
                if (data.isSuccessful) {
                    this.listOfUsers().push(data.results);
                } else {

                }
            }).always(() => {
                this.isLoading(false);
            });
    }

【讨论】:

  • 这两个代码块看起来相同,但我想解决方法是将 this.listOfUsers().push(data.results); 更改为 this.listOfUsers.push(data.results); 以便推送到可观察数组而不是解包的 javascript 数组。
  • 不 :) .done((data: IPagableResourceModel&lt;IUser&gt;) =&gt; {.done((data: IPagableResourceModel&lt;IUser[]&gt;) =&gt; {
猜你喜欢
  • 2023-03-13
  • 2012-07-17
  • 1970-01-01
  • 2019-03-16
  • 2016-11-25
  • 2014-01-10
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
相关资源
最近更新 更多