【问题标题】:Factory Array can be pushed but not replacedFactory Array 可以推送但不能替换
【发布时间】:2023-03-04 14:00:01
【问题描述】:

我有这个工厂

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 = [] 然后 datos.propiedadesFiltradas.push(data);
  • 是的,由于 dfsq 的回答而没有工作!

标签: javascript angularjs


【解决方案1】:

当您重新分配 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>

【讨论】:

    【解决方案2】:

    由于 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"
    

    【讨论】:

      猜你喜欢
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 2021-06-18
      • 2011-04-16
      • 2017-12-21
      相关资源
      最近更新 更多