工厂阵列只能被推入,不能被替换

Factory Array can be pushed but not replaced

本文关键字:不能 替换 工厂 阵列      更新时间:2023-09-26

我有这个工厂

DatosFactory.js

(function() {
    'use strict';
    angular.module('InmoManager')
    .factory('DatosFactory', function($http, $location) {
        var datos = {
            propiedadesFiltradas: []
        }
        ...
        datos.getPropiedadesFiltradas = function(){
            return datos.propiedadesFiltradas;
        }
        datos.setPropiedadesFiltradas = function(data){
            datos.propiedadesFiltradas.length = 0;
            datos.propiedadesFiltradas.push(data);
        }
        return datos;
    })
})();

这个控制器

SidebarController.js

(function() {
    'use strict';
    angular.module('InmoManager')
    .controller('SidebarController', function($http, $scope, DatosFactory) {
        var sidebarCtrl = this;
        sidebarCtrl.toggleSidebar = function(){
            $('#wrapper').toggleClass('toggled');
        }
        sidebarCtrl.propiedades = DatosFactory.getPropiedadesFiltradas();
    });
})();

让这个工作

pageSidebar.html

<li class="item" ng-repeat="propiedad in sidebarCtrl.propiedades[0] | orderBy:'titulo'">

这个工作很棒!,但是,我想改变这个:

ng-repeat="propiedad in sidebarCtrl.propiedades[0]"

ng-repeat="propiedad in sidebarCtrl.propiedades"

datos.setPropiedadesFiltradas = function(data){
    datos.propiedadesFiltradas.length = 0;
    datos.propiedadesFiltradas.push(data);
}

datos.setPropiedadesFiltradas = function(data){
    datos.propiedadesFiltradas = data;
}

但是当我这样做时,变量sidebarCtrl.propiedades未定义(当我调用datos.setPropiedadesFiltradas()

时不更新)

当你重新分配datos.propiedadesFiltradas = data;时,你破坏了对象引用,结果datos.propiedadesFiltradas不再指向Angular设置绑定的对象。

另一方面,当你推送对象时,引用保持不变,Angular的更改跟踪引擎可以检测到更改并呈现视图。

还有一点。我建议你用ngClass指令代替$('#wrapper').toggleClass('toggled');:

sidebarCtrl.toggleSidebar = function() {
    sidebarCtrl.toggle = !sidebarCtrl.toggle;
}

和HTML中的

<div id="wrapper" ng-class={toggled: toggle}>...</div>

由于dfsq的答案,我认为我想要的一切都是不可能的,但我发现了这个"部分"解决方案

在工厂:

    datos.setPropiedadesFiltradas = function(data){
        datos.propiedadesFiltradas.length = 0;
        datos.propiedadesFiltradas.push.apply(datos.propiedadesFiltradas,data);
    }

我可以改变这个:

    ng-repeat="propiedad in sidebarCtrl.propiedades[0]"

    ng-repeat="propiedad in sidebarCtrl.propiedades"