【问题标题】:How to move functions to a separate file in MVVM?如何将函数移动到 MVVM 中的单独文件?
【发布时间】:2014-02-20 11:35:49
【问题描述】:

我有关注 Kendo UI MVVM。这里的业务功能写在viewModel里面。我们怎样才能把这些功能移动到不同的文件中呢?

我面临的挑战是由于这些函数中的 “this” 关键字,它引用了 observable 中存在的模型。

查看模型

<script type="text/javascript">
    var viewModel = kendo.observable({

        // model definition
        employees: [
        { name: "Lijo", age: "28" },
        { name: "Binu", age: "33" },
        { name: "Kiran", age: "29" }
        ],

        personName: "",
        personAge: "",

        //Note: Business functions  does not access any DOM elements using jquery.
        //They are referring only the objects in the view model.

        //business functions  (uses "this" keyword - e.g. this.get("employees"))
        addEmployee: function () {
            this.get("employees").push({
                name: this.get("personName"),
                age: this.get("personAge")
            });

            this.set("personName", "");
            this.set("personAge", "");
        },

        deleteEmployee: function (e) {

            //person object is created using "e"
            var person = e.data;

            var employees = this.get("employees");
            var index = employees.indexOf(person);
            employees.splice(index, 1);
        }

    });

</script>

头部

<head>
    <title>MVVM Test</title>

    <script type="text/javascript" src="lib/kendo/js/jquery.min.js"></script>
    <script type="text/javascript" src="lib/kendo/js/kendo.web.min.js"></script>

    <!----Kendo Template-->
    <script id="row-template" type="text/x-kendo-template">
          <tr>
                <td data-bind="text: name"></td>
                <td data-bind="text: age"></td>
                <td><button type="button" data-bind="click: deleteEmployee">Delete</button></td>
                <td>
          </tr>
    </script>


    <!--MVVM Wiring using Kendo Binding-->
    <script type="text/javascript">

        $(document).ready(function () {
            kendo.bind($("body"), viewModel);
        });

    </script>

</head>

身体

<body>
    <table>
        <thead>
            <tr>
                <th>
                    Name
                </th>
                <th>
                    Age
                </th>
            </tr>
        </thead>
        <!--The data-template attribute tells Kendo UI that the employees objects should be formatted using a Kendo UI template. -->
        <tbody data-template="row-template" data-bind="source: employees">
        </tbody>
    </table>
    <br />
    <br />
    <form>
    <input type="text" name="personName" placeholder="Name" data-bind="value: personName" /><br />
    <input type="text" name="personAge" placeholder="Age" data-bind="value: personAge" /><br />
    <button type="button" data-bind="click: addEmployee">
        Add</button>
    </form>
</body>

参考文献

  1. The Kendo MVVM Framework - packtpub
  2. MVVM / Remote binding -- demos.telerik
  3. DropDownList / MVVM - demos.telerik
  4. DataSource / Basic usage

【问题讨论】:

    标签: javascript jquery mvvm kendo-ui


    【解决方案1】:

    无论您是在另一个 javascript 文件中还是在 kendo.observable 函数之外定义它,您只需要将 'this' 绑定到该函数即可。

    这是未经测试的,但第一个可能有效,而第二个肯定有效!

     function externalAddEmployee() {
        this.get("employees").push({
               name: this.get("personName"),
               age: this.get("personAge")});
        this.set("personName", "");
        this.set("personAge", "");        
    }
    
    kendo.observable({
        // first solution: may not work because the 'this' you want is not properly defined
        addEmployee: externalAddEmployee.bind(this);
        // second solution: will work everytime
        // the 'this' is properly defined, just proxy the call to the function
        addEmployee: function() { return externalAddEmployee.apply(this, arguments); }
    
    })
    

    为了改进第二种方案,你甚至可以制作一个辅助函数:

    function proxy(fn) { return function() { return fn.apply(this, arguments); })
    // and then
    kendo.observable({
        addEmployee: proxy(externalAddEmployee)
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      相关资源
      最近更新 更多