绑定到服务变量的AngularJS 1.6.9控制器变量不变

时间:2018-09-30 18:55:10

标签: angularjs angularjs-service angularjs-controller angularjs-components

我有2个组件都在访问服务。一个组件交付一个对象,而另一个组件应该显示它或仅接收它。问题在于初始化过程完成后,显示组件中的变量不会更改。

我尝试使用 $ scope $ scope。$ apply() this。$ onChanges 以及 $ scope 。$ watch 来跟踪变量,但始终保持不变。

显示组件中的此控制器在对象中提供了来自输入字段的文本。

import maya.cmds as cmds

import maya.mel as mel

import pymel.core as pm

def pressandrag():
    x, y, z = tuple(cmds.draggerContext( 'pressandragCtx', query=1, dragPoint=1))

    newBox = selection=pm.ls(sl=1)
    cmds.setAttr("%s.t" % newBox[0], x, y, z)

ctx = 'pressandragCtx'

if cmds.draggerContext(ctx, exists=True):
    cmds.deleteUI(ctx)
cmds.draggerContext('pressandragCtx', dragCommand='pressandrag()', space='world')    
cmds.setToolTo('pressandragCtx')

这就是服务,它获得对象并将其保存到 this.currentText 中。

app.controller("Test2Controller", function ($log, TestService) {

    this.click = function () {
        let that = this;
        TestService.changeText({"text": that.text});
    }
});  

这是应该用来显示对象的控制器,但是甚至无法更新 this.text 变量。

app.service("TestService", function ($log) {

    this.currentText = {};

    this.changeText = function (obj) {
        this.currentText = obj;
        $log.debug(this.currentText);
    };

    this.getCurrentText = function () {
        return this.currentText;
    };

});  

我花了很多时间来寻找答案,但是大多数都与指令有关或在我的情况下不起作用,例如将对象放入另一个对象的一种解决方案。我认为可以使用 $ broadcast $ on ,但是听说可以避免使用它。我正在使用的角度版本是:1.6.9

1 个答案:

答案 0 :(得分:1)

我发现您的方法存在问题。您正在尝试共享一个对象的单个引用。您只想共享一次对象引用,并想在使用过的任何地方都将其反映出来。但是根据changeText方法,您正在建立对currentText服务属性的新引用,这是错误的。

相反,我建议您始终使用一个对象的单个引用,这样可以照顾到多个控制器之间共享对象。

服务

app.service("TestService", function ($log) {
    var currentText = {}; // private variable
    // Passing text property explicitly, and changing that property only
    this.changeText = function (text) {
        currentText.text = text; // updating property, not changing reference of an object
        $log.debug(currentText);
    };
    this.getCurrentText = function () {
        return currentText;
    };
});

现在从changeText方法开始,只需传递需要更改为text的{​​{1}},而不是新对象。