Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将反向url传递给knockout.js模型_Javascript_Python_Django_Url_Knockout.js - Fatal编程技术网

Javascript 将反向url传递给knockout.js模型

Javascript 将反向url传递给knockout.js模型,javascript,python,django,url,knockout.js,Javascript,Python,Django,Url,Knockout.js,我得到了带有knockout.js绑定的django模板,其中的列表应该作为一个按钮填写: <ul data-bind="foreach: items"> <li data-bind="text: title"><li> </ul> <button data-bind="click: fillList">Show</button> FunctionFillList从服务器获取数据。它应该向url发送请求。我使用反向u

我得到了带有knockout.js绑定的django模板,其中的列表应该作为一个按钮填写:

<ul data-bind="foreach: items">
   <li data-bind="text: title"><li>
</ul>
<button data-bind="click: fillList">Show</button>
FunctionFillList从服务器获取数据。它应该向url发送请求。我使用反向url:

{% url "app.views.get_items" %}
将模板生成的url传递给ItemsModel的最佳方式是什么,以便它知道应该从哪里获取数据

将其作为参数传递给模型

function ItemsModel(url_get_items) {
     ...
}
是否可以通过单击事件将其作为参数传递

<button data-bind="click: function() { fillList('{% url "app.views.get_items" %}') }">
或者改用提交绑定

<form action="{% url "app.views.get_items" %}" data-bind="submit: fillList">
    <button type="submit">Show</button>
</form>

还有别的吗?有什么最好的方法吗?

我通常将url放在脚本中读取的元素的属性中,并在创建时传递给视图模型。以下是一个例子:

HTML


下面是一个

所以,回答我自己的问题。我发现并成功使用的最好的方法是传递给模型URL对象。通常是这样的:

<script>
    var model = new ItemsModel({
        csrf: '{{ csrf_token }}',
        url: {
            'items': '{% url "items.views.items.api.list" %}',
            ...
            'remove_item': '{% url "items.views.items.api.remove" %}'
        }
    });
    ko.applyBindings(model);
</script>
<script>
    define('settings', { 
        csrf: '{{ csrf_token }}',
        url: {
            'items': '{% url "items.views.items.api.list" %}',
            ...
            'remove_item': '{% url "items.views.items.api.remove" %}'
        }
    });
</script>
如果您计划使用r.js,则应在config中为设置提供空路径,如下所示:

({
    baseUrl: 'items-app',
    out: 'dist/items.js',
    paths: {
        'knockout': 'path/to/knockout',
        'settings': 'empty:',
    }
})

唯一的问题是,此方法不适用于带有参数的URL。最简单的解决方法是使用post或get方法传递所有参数。

谢谢您的回答。这有点道理,但是如果你有几个url怎么办?如果有更多的url,我通常会添加一个基本url。或者可能是几个基本URL。
<script>
    var model = new ItemsModel({
        csrf: '{{ csrf_token }}',
        url: {
            'items': '{% url "items.views.items.api.list" %}',
            ...
            'remove_item': '{% url "items.views.items.api.remove" %}'
        }
    });
    ko.applyBindings(model);
</script>
<script>
    define('settings', { 
        csrf: '{{ csrf_token }}',
        url: {
            'items': '{% url "items.views.items.api.list" %}',
            ...
            'remove_item': '{% url "items.views.items.api.remove" %}'
        }
    });
</script>
require(['settings', 'knockout'], function (settings, ko) {
    var model = new ItemsModel(settings);
    ko.applyBindings(model);
});
({
    baseUrl: 'items-app',
    out: 'dist/items.js',
    paths: {
        'knockout': 'path/to/knockout',
        'settings': 'empty:',
    }
})