为什么Salesforce Apex中的属性没有设置?

3
我有一个VisualForce页面testPage
<apex:page controller="testController">
    {!myString}, {!myString1}, {!myString2}, {!Mystring3}, {!myString}
</apex:page>

控制器是

public class testController {
    public string myString {get;set;}
    public string getMyString1()
    {
        return myString;
    }

    public string getMyString2()
    {
        if(myString==null)
            myString = 'Method2';
        return myString;
    }

    public void getMystring3()
    {
        myString = 'Method3';
    }
}

加载页面时,它输出,,Method2,,。两种方法getMyString2getMystring3都设置属性。为什么这里没有设置myString属性呢?

你尝试过使用简单的setString()方法吗?而不是set和get吗? - sForSujit
2个回答

0
在页面中评估合并表达式时:
{!myString}, {!myString1}, {!myString2}, {!Mystring3}, {!myString}

事件的顺序是:
1. testController get(myString),它是null,因为该变量尚未初始化
2. testController get(myString1),这也是null,因为返回的值仍然是null
3. testController get(myString2),它将变量myString设置为Method2的值并返回该值
4. testController get(Mystring3),它将变量myString设置为Method3的值并返回空值
5. 就这样。即使在visualforce页面中再次写入{!myString},页面也不会返回控制器重新获取值,因为它已经获取了一次,并且已经知道它的值;假设(在本例中错误地)该值没有改变。

如果您将您的VF页面更改为:

<apex:page controller="testController">
    {!myString1}, {!myString2}, {!Mystring3}, {!myString}
</apex:page>

testController get(myString) 会在 testController get(Mystring3) 后被调用,因此页面显示的结果将是:

, Method2, , Method3


所有这些都说了,getter 不应该改变程序的状态,如果你依赖这种行为,只会让你的代码难以理解。

0

我知道Salesforce曾经将“test”这个词保留给测试类。如果它根本没有触发,请尝试重命名它。Salesforce可能会认为它们是测试类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接