在viewmodel构造函数

时间:2015-06-10 11:38:01

标签: javascript knockout.js knockout-mapping-plugin

我试图在构造函数中使用映射插件,这样我就可以轻松地将其他函数添加到构造函数中,并从映射插件中自动创建可观察项。这是我目前拥有的代码,但它既不映射我提供的可观察变量,也不包括' save'函数在end viewmodel中。有更好的方法吗?

function ViewModel(model){
        var self = this;

        self = ko.mapping.fromJS(model);

        self.save = function() {
            var data = ko.toJSON(self);
            $.post("/Licensing/edit", data, function(returnedData) {
                // This callback is executed if the post was successful
            });
        }

    };

    var vm = new ViewModel(model);
    ko.applyBindings(vm);

3 个答案:

答案 0 :(得分:3)

您的代码无效,因为<android.support.v4.widget.DrawerLayout android:id="@+id/drawer" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent“> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" orientation="vertical"> <include android:id="@+id/toolbar_actionbar" layout="@layout/toolbar_default" android:layout_width="match_parent" android:layout_height="wrap_content"/> <FrameLayout android:id="@+id/main_fragment_container" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout> <!-- android:layout_marginTop="?android:attr/actionBarSize"--> <fragment android:id="@+id/fragment_drawer" android:name="com.ulusol.knowmyshop.navigationdrawer.NavigationDrawerFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="start" app:layout="@layout/fragment_navigation_drawer"/> </android.support.v4.widget.DrawerLayout> 会返回您为ko.mapping.fromJS(model);本地变量分配的新对象,而您使用self函数扩展了该对象。

但是,这个新对象不会从构造函数返回,因此您将以空对象结束,因为最初传入的save不会被修改。

您可以通过从构造函数返回this来解决此问题:

self

或者您可以告诉映射插件不创建新对象只使用当前创建的对象并传递function ViewModel(model){ var self = this; self = ko.mapping.fromJS(model); self.save = function() { var data = ko.toJSON(self); $.post("/Licensing/edit", data, function(returnedData) { // This callback is executed if the post was successful }); } return self; }; 作为第三个参数:

self

答案 1 :(得分:2)

没有理由使用构造函数(使用$$1+1$$)。您不打算制作多个实例或拥有原型。只需使用为您创建的对象new

ko.mapping

答案 2 :(得分:0)

另外,save是一个私有方法,像这样写保存:

  

self._save = function(){            }