【问题标题】:Angularjs List/Detail EditAngularjs 列表/详细信息编辑
【发布时间】:2015-02-20 10:00:23
【问题描述】:

我正在编写一个小型 AngularJS/Ionic/Cordova 应用程序,其中有一个联系人列表。当用户点击联系人时,我导航到一个新页面,其中显示了有关联系人的详细信息(名字、姓氏、电话号码)。在这里,用户可以更新联系人的详细信息,或删除联系人。我遇到的问题是当用户删除联系人时,列表在导航回来后仍然显示已删除的项目。

现在我将联系人列表存储在 localStorage 中,但我确实计划最终将这些值保存在 SQLite 和/或 Web 服务中。

我正在使用两个控制器、两个 html 模板和一个工厂。当我对详细信息项目进行更改时,为什么第一个列表没有更新?我对 AngularJS 很陌生,所以请多多包涵。

列表控制器

angular
.module('app')
.controller('contactListCtrl', ['$scope', 'Contacts',
    function($scope, Contacts) {

        $scope.contacts = Contacts.get();

    }
])

列表模板

<ion-content scroll="false" class="padding-horizontal" has-header="true">
    <div class="row padding-vertical">
        <div class="col col-center text-center">
            <span class="small-text primary-text-color">Contact List</span>
        </div>
    </div>

    <div class="row" >
        <div class="col col-center">
            <ul class="list">
                <li class="item" ng-repeat="contact in contacts" ui-sref="contactListEdit({id: $index})">
                    {{contact.fName}} {{contact.lName}}
                </li>
            </ul>
        </div>
    </div>
</ion-content>

细节控制器

angular
    .module('app')
    .controller('editContactCtrl', ['$scope', '$stateParams', 'Contacts',
    function($scope, $stateParams, Contacts) {
        var contactId = false;

        if ($stateParams.id !== 'undefined') {
            contactId = $stateParams.id;
        }

        $scope.contact = Contacts.get(contactId);
        $scope.contactId = contactId;

        $scope.delete = function(index) {
            Contacts.removeContact(index);
            window.history.back();
        };
    }
])

详细模板

<ion-content scroll="false" class="padding-horizontal" has-header="true">
    <div class="row padding-vertical">
        <div class="col col-center text-center">
            <span class="medium-text primary-text-color">Edit contact</span>
        </div>
    </div>

    <div class="list">
    <label class="item item-input">
        <input type="text" placeholder="First Name" ng-model="contact.fName">
    </label>
    <label class="item item-input">
        <input type="text" placeholder="Last Name" ng-model="contact.lName">
    </label>
    <label class="item item-input">
        <input type="text" placeholder="Phone" ng-model="contact.mobile">
    </label>
    <label class="item item-input">
        <input type="text" placeholder="Email" ng-model="contact.email">
    </label>
    <button ng-click="save()" class="button button-full button-positive">
        Save
    </button>
    <button ng-click="delete(contactId)" class="button button-full button-assertive">
        Delete
    </button>
    </div>
</ion-content>

联系工厂

angular
    .module('app')
    .factory('Contacts', ['$http',
        function($http) {
            return {
                get: function(index) {
                    var contacts;
                    try {
                        contacts = JSON.parse(window.localStorage.getItem("contacts"));
                        if (index >= 0) {
                            return contacts[index];
                        }
                        return contacts;
                    } catch (e) {
                        console.log("error parsing json contacts");
                        return false;
                    }
                },

                removeContact: function (index) {

                    var contactList = this.get();
                    if (index !== -1) {
                        contactList.splice(index, 1);
                    }
                    console.log(contactList);
                    this.saveContacts(contactList);
                },

                setDefaultContacts: function() {
                    var self = this;
                    return $http.get('./mock_data/contacts.json').then(function(response) {
                        // contacts already exist, don't set.
                        if (window.localStorage.getItem("contacts")) {
                            return false;
                        } else {
                            self.saveContacts(response.data);
                            return true;
                        }
                    });
                },
                saveContacts: function(contactList) {
                    window.localStorage.setItem("contacts", JSON.stringify(contactList));
                },
            };
        }
    ])

【问题讨论】:

    标签: angularjs angularjs-scope angularjs-factory


    【解决方案1】:

    我想你会发现当你导航回它时(删除后),contactListCtrl 没有被再次设置。我相信这是因为 Ionic 会为您缓存视图。

    您需要做的是监听 $ionicView.beforeEnter 事件,并在收到此事件时将您的联系人列表加载到您的 ContactListCtrl 范围内。

    所以.. 尝试在您的控制器中添加类似这样的内容:

    $scope.$on('$ionicView.beforeEnter', function() {
            $scope.contacts = Contacts.get();
        }
    );
    

    查看:http://ionicframework.com/blog/navigating-the-changes/

    【讨论】:

    • 这个答案很完美,它解决了我的问题。有没有办法可以自动检测联系人列表上的更改并重新呈现列表而不是手动刷新?我最终需要支持 Windows 手机,所以我将放弃离子,这似乎是一个非常离子特定的答案。再次感谢!
    • 哈哈不用担心。感谢您重新格式化,我正在打电话:P 我认为您可以订阅控制器中的联系人更改。签出:stackoverflow.com/questions/12576798/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多