【问题标题】:Iterate though Silverlight Dictionary from JavaScript?从 JavaScript 遍历 Silverlight 字典?
【发布时间】:2011-10-20 00:00:13
【问题描述】:

我正在尝试从 JavaScript 访问 Silverlight 字典。正如here 所述,Silverlight 为可以通过 JavaScript 访问的 Dictionary 类型创建了一个包装器。

function MyFunction(dictionary)
{
    // This works okay...
    alert(dictionary["someKey"]);
}

但是,就我而言,我不知道字典中实际包含哪些键。然而,MSDN 页面似乎没有描述任何访问此信息的方法。我试过了:

function MyFunction(dictionary)
{
    for (var item in dictionary)
    {
        // Do stuff
        alert(item);
    }
}

但这不起作用。我也尝试过使用为数组定义的属性和方法,例如lengthtoArray()。我试过猜测keys 属性。不用说它们都不起作用。

这是 Silverlight 暴露的包装器中的主要疏忽,还是我遗漏了什么?最好的选择是什么?

为了完整起见,Silverlight 代码不是很有趣,但看起来像:

void MyMethod(IDictionary<string, string> dictionary)
{
    jsObjectDefiningMyFunction.MyFunction(dictionary);
}

【问题讨论】:

    标签: javascript silverlight


    【解决方案1】:

    IDictionary 包装器 似乎 像一个常规 JavaScript 对象(您可以在其中访问 object["key"]object.key 等属性,但从文档看来它唯一支持的是使用已知键(而不是迭代)的 getter/setter。

    我建议向您的 JavaScript 函数添加另一个参数,该参数只是字典键的数组或列表,然后您可以在 JavaScript 端进行迭代,即

    string[] keys = new string[dictionary.Keys.Count];
    dictionary.Keys.CopyTo(keys,0);
    jsObjectDefiningMyFunction.MyFunction(dictionary, keys);
    

    键将使用数组包装器进行编组,可以使用长度在 javascript 端进行迭代,例如myVar[3].

    【讨论】:

    • 只需将键作为dictionary.Keys.ToArray() 传递
    • Silverlight 似乎不支持 KeyCollection 上的 ToArray() 方法。
    【解决方案2】:

    你没有错过任何东西。 Javascript 的for..in 功能不是 COM 对象支持的(这将是包装器的基本功能)。我可以想象从 Silverlight 实现这将是一件相当棘手的事情。

    替代方案实际上取决于您的 Javascript 代码真正需要做什么。这是一种创建标准 javascript 对象的方法,for..in 可以在其中工作:-

            ScriptObject o = HtmlPage.Window.CreateInstance("Object");
            foreach (var kvp in dictionary)
            {
                o.SetProperty(kvp.Key, kvp.Value);
            } 
    
            jsObjectDefiningMyFunction.MyFunction(o);
    

    但是我怀疑在大多数情况下这是一种非常低效的方法,但确实取决于 javascript 使用场景。例如,这非常适合构造要传递给许多 JQuery 方法的对象。另一方面,偶尔查找单个项目的当前值是很糟糕的,如果您需要更新该值,则毫无用处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 2013-04-16
      相关资源
      最近更新 更多