0

我即将构建一个简单的“抵押贷款计算器”,用户将在其中调整一些滑块或编辑输入字段中的值,以便根据提供的数据计算一些最终值。

从示意图上看,它看起来像这样:

Slider1 - Input1
Slider2a - Input2a
Slider2b - Input2b

这个想法是输入的值必须反映在滑块中,反之亦然。此外,根据一些简单的规则,滑块 2a/2b 和输入 2a/2b 的值和限制相互依赖。

它必须在我以前从未使用过的 Dojo 中完成,尽管 Dojo 有很好的文档,但它有点压倒性,所以如果有人能指出我正确的方向,我将不胜感激。

4

3 回答 3

3

首先,这是我在 jsFiddle 工作的解决方案:http: //jsfiddle.net/phusick/HCx3w/

您可以使用dojo/aspect,dojo/topicdojo/Stateful直接以各种方式将这些小部件相互连接。您可能最终会得到一组紧密耦合的小部件,即这些小部件将相互了解,即使特定小部件没有理由知道其值与另一个小部件同步的事实。

与上述相反,您可以应用loose coupling原则,这将允许您同步任意数量的小部件,而它们之间没有任何相互引用。这是我的解决方案:

  1. 获取对小部件的引用并将它们耦合到集合中 ( arrays):

    var slider1 = registry.byId("slider1");
    var slider2 = registry.byId("slider2");
    var spinner1 = registry.byId("spinner1");
    var spinner2 = registry.byId("spinner2");
    
    var set1 = [slider1, spinner1];
    var set2 = [slider2, spinner2];
    
  2. synchronize功能:

    var synchronize = function(/*Array*/ widgets, /*String*/ topicName) {
    
        var synchronized = function() {
            var count = 0;
            array.forEach(widgets, function(widget) {
                if(widget.get("synchronized") === true) { count++} 
            });
            return (count == widgets.length);
        }
    
        array.forEach(widgets, function(w) {
    
            w.set("synchronized", false);
    
            // register onchange handler for each widget in the set
            w.on("change", function(value) {
                array.forEach(widgets, function(widget) {
                    if(this !== widget) {
                        widget.set("value", value);
                        widget.set("synchronized", true);
                    }                                         
                }, this);
    
                // needed to publish topic just once per value change across all the widgets in the set
                if(synchronized()) {
                    array.forEach(widgets, function(widget) {
                        widget.set("synchronized", false);
                    });
                    // publish topic if any
                    if(topicName) { topic.publish(topicName, value)};
                }
            });
        });
    }
    
  3. 注册小部件集以通过sychronize函数同步:

    synchronize(set1, "value1-changed");   // synchronize and publish topic when value changes
    synchronize(set2);                     // just synchronize
    
  4. 订阅topic您在上面注册的内容:

    topic.subscribe("value1-changed", function(value) {
        console.log("value1-changed", value);
        // here you can change value and limits of of `set2` widgets
    });
    
于 2012-05-23T11:11:28.793 回答
0

你试过dojo.connect吗?这可以用于方法链接。因此,当事件在控件中触发时,可以调用多个方法。除此之外,dojo 中还有发布订阅机制。在 pub\sum 模型中,您可以编写订阅简单消息字符串的方法。当某个方法发布该字符串时,将调用订阅者方法。

于 2012-05-23T05:15:49.017 回答
0

道场。有状态是你的朋友... http://dojotoolkit.org/reference-guide/1.7/dojo/Stateful.html

于 2012-05-23T07:28:56.293 回答