0

我不确定我做错了什么,这就是我如何设置其他工厂来共享数据,但即使数组应该通过引用传递并且我不会覆盖数组所以参考不会丢失模板永远不会加载我可以从查找所有请求中看到的数据。谁能看到我为使该工厂正常工作并在控制器之间共享而做了/尚未做的事情?

我最初设置它时不使用服务,所以我知道从请求返回的数据确实适用于视图,如果你查看我的存根,数据就在那里(看起来一样),但视图永远不会更新。如果这不是我错过并且似乎不理解的明显错误,我也会感谢您的快速评论,因为我认为对象/数组是通过引用传递的事实,这使得这一切都有效。

联系人控制器

// Stripped down for brevity...
(function () {

    'use strict';

    function ContactsController(ContactsFactory,
                                ContactsResource) {

        var vm = this;

        vm.contacts = ContactsFactory.get();

        vm.findAll = function () {

            ContactsResource
                .all()
                .then(function (response) {
                    ContactsFactory.add(response.contacts); // <-- an array of objects for example: [{id: 5, username: "Richard39", email: "Sanford.Marilyne@Gibson.org",…},…]
                });
        };

        vm.remove = function (contact, index) {

            ContactsResource
                .remove()
                .then(function (response) {
                    ContactsFactory.remove(index);
                });
        };

        function init() {
            vm.findAll();
        }

        init();
    }

    ContactsController.$inject = [
        'ContactsFactory',
        'ContactsResource'
    ];

    angular
        .module('app')
        .controller('ContactsController', ContactsController);

})();

联络服务

// Stripped down for brevity...
(function () {

    'use strict';

    function ContactsFactory() {

        var contacts = [];

        function get() {
            return contacts;
        }

        function add(contacts) {

            console.log(contacts) // <-- array of objects

            angular.forEach(contacts, function(contact) {

                console.log(contact) // <-- object
                contacts.list.push(contact);
            });

            console.log(contacts) // <-- objects pushed onto array [Object, Object, Object, Object, Object,…]

            // But no update in view, which worked with same resource 
            // request, prior to switching to factory to share between 
            // controllers
        }

        function remove(index) {
            contacts.splice(index, 1);
        }

        // ---
        // PUBLIC API.
        // ---

        return {
            get: get,
            add: add,
            remove: remove
        };
    }

    ContactsFactory.$inject = [];

    angular
        .module('app')
        .factory('ContactsFactory', ContactsFactory);

})();

更新

使用@Rob 的建议可以完成这项工作,我注意到如果我添加 service.contacts 作为 getter 的返回值,它也可以工作,并且我验证了联系人可以被删除。 所以我仍然很想知道为什么这会起作用,而不是像上面的例子那样只使用数组作为联系人。数组不是像我最初想象的那样通过引用传递,它只是对象吗?我只想给我做错的事情起个名字,这样就可以记住了。

(function () {

    'use strict';

    function ContactsFactory() {

        var service = {
            contacts: []
        };

        function get() {
            return service.contacts;
        }

        function add(contacts) {
            angular.forEach(contacts, function(contact) {
                service.contacts.push(contact);
            });

            console.log(contacts);
        }

        function remove(index) {
            contacts.splice(index, 1);
        }

        return {
            contacts: service.contacts, // <-- Rob's suggestion
            get: get, // <-- this also works now as well
            add: add,
            remove: remove
        };
    }

    ContactsFactory.$inject = [];

    angular
        .module('app')
        .factory('ContactsFactory', ContactsFactory);

})();
4

0 回答 0